2016-02-18 57 views
1

有没有什么办法可以拒绝启动一个没有连接到特定路径的容器的容器?如何强制IBM Bluemix中的Docker容器连接卷?

我有一个mysql容器,并希望阻止启动容器(退出时出现错误),其中没有卷连接到/ var/lib/mysql以主持卷。 IBM Bluemix中有一个选项,用于将容器的指定路径添加到容器中。如果有人忘记添加音量,我需要阻止启动容器。

另外,是否有可能找出容器内是否有从主机到容器的卷? (添加一个支票到入口点)

回答

2

容器卷包含容器的名称在安装路径中,基本上可以在您的Dockerfile中创建一个入口点脚本来检查卷名是否存在。我使用df | grep volume-name来检查在入口点脚本中是否装入了卷。 这是安装了卷容器中运行df的例子(这里体积adsdatabase):

# df 
Filesystem 1K-blocks Used Available Use% Mounted on 
/dev/mapper/docker-8:16-212573961-302136b327f5923d7c9b8c6c2cf62c0783 10190136 466892 9182572 5%/
tmpfs 132022832 0 132022832 0% /dev 
shm 65536 0 65536 0% /dev/shm 
nfsdal0901d.service.softlayer.com:/IBM01SV531277_366/adsdatabase 20971520 23168 20948352 1% /data 
/dev/sdb 11522552336 200321280 10741487072 2% /etc/hosts 
udev 132009268 4 132009264 1% /dev/tty 

,我建议你不要使用一个共同的名字,如“数据”,该卷名称或grep的会匹配的。

下面是我没有以下步骤:

  1. 创建入口点脚本,检查用于使用df命令体积的存在(见下文样本entrypoint.sh文件)
  2. 创建Dockerfile并添加ENTRYPOINT命令以运行您的入口点脚本(请参阅下面的示例Dockerfile
  3. 创建新映像并推送到您的Bluemix注册表,例如:

    $ docker build -t ads-volumesample . $ docker tag ads-volumesample registry.ng.bluemix.net/namespace/ads-volumesample $ docker push registry.ng.bluemix.net/namespace/ads-volumesample

  4. 创建卷 - 该卷的名称在入口点脚本检查相匹配,例如:

    $ cf ic volume create adsdatabase

  5. 创建一个新的容器,并添加新的卷:

    $ cf ic run -v adsdatabase:/data --name ads-volumesample1 registry.ng.bluemix.net/namespace/ads-volumesample

如果在创建容器时不添加卷,容器将失败并在几分钟内自动关闭。

入口点。SH

#!/bin/bash 
set -e 

if df | grep adsdatabase > /dev/null; then 
    echo "Found volume" 
else 
    echo "Volume not found" 
    exit 1 
fi 

exec "[email protected]" 

Dockerfile

FROM registry.ng.bluemix.net/ibmnode 

ADD ./app /node 

ENV NODE_ENV production 

RUN cd /node && npm install 
COPY entrypoint.sh/
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 3000 

CMD ["node", "/node/app.js"] 
+0

谢谢。在你写这些之前,我已经这样做了。问题是,我起初只用Docker在本地尝试它。但用bluemix你可以得到音量。超过df,我推荐使用mount | grep nfs4。 – bartimar

+0

使用nfs4你将依赖于技术,理论上它可以透明地改变,你的脚本不会编写脚本。使用像亚历克斯建议的卷名,它实际上更便携 –

+0

我不关心卷名称。我关心有什么容量连接到容器内的/ var/lib/mysql ... – bartimar

1

你可以简单地运行一个脚本来检查卷的安装路径(/ var/lib/mysql)是否包含卷内容(它确认卷正确安装) 请记住: - 卷装入路径即使在未装入卷时也存在,您必须检查其内容而不是路径本身 - 如果第一次启动时运行初始化过程您可以预料到在那一刻音量是空的,而且安装点也是空的:所以在初始化时跳过检查,或者对此有特定的情况

+0

如何从容器内部的东西是完全在容器外检查? – bartimar

+0

或者你的意思是喜欢先在连接的音量中有东西?然后起始容器检查它是否在那里?准确地说是 – bartimar

+0

。 您可以检查装入的文件系统,并且Bluemix卷通过NFS装入,但它不是真正便携的。 因此,如果您希望初始化(创建数据库和插入数据),您可以更轻松地检查卷装载点的内容:这意味着当您的容器启动时将检查路径/ var/lib/mysql(如果它是卷挂载点)并且如果为空(因此卷未连接到容器)将不会启动mysql数据库 –

相关问题