有没有什么办法可以拒绝启动一个没有连接到特定路径的容器的容器?如何强制IBM Bluemix中的Docker容器连接卷?
我有一个mysql容器,并希望阻止启动容器(退出时出现错误),其中没有卷连接到/ var/lib/mysql以主持卷。 IBM Bluemix中有一个选项,用于将容器的指定路径添加到容器中。如果有人忘记添加音量,我需要阻止启动容器。
另外,是否有可能找出容器内是否有从主机到容器的卷? (添加一个支票到入口点)
有没有什么办法可以拒绝启动一个没有连接到特定路径的容器的容器?如何强制IBM Bluemix中的Docker容器连接卷?
我有一个mysql容器,并希望阻止启动容器(退出时出现错误),其中没有卷连接到/ var/lib/mysql以主持卷。 IBM Bluemix中有一个选项,用于将容器的指定路径添加到容器中。如果有人忘记添加音量,我需要阻止启动容器。
另外,是否有可能找出容器内是否有从主机到容器的卷? (添加一个支票到入口点)
容器卷包含容器的名称在安装路径中,基本上可以在您的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的会匹配的。
下面是我没有以下步骤:
df
命令体积的存在(见下文样本entrypoint.sh
文件)Dockerfile
并添加ENTRYPOINT
命令以运行您的入口点脚本(请参阅下面的示例Dockerfile
)创建新映像并推送到您的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
创建卷 - 该卷的名称在入口点脚本检查相匹配,例如:
$ cf ic volume create adsdatabase
创建一个新的容器,并添加新的卷:
$ 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"]
你可以简单地运行一个脚本来检查卷的安装路径(/ var/lib/mysql)是否包含卷内容(它确认卷正确安装) 请记住: - 卷装入路径即使在未装入卷时也存在,您必须检查其内容而不是路径本身 - 如果第一次启动时运行初始化过程您可以预料到在那一刻音量是空的,而且安装点也是空的:所以在初始化时跳过检查,或者对此有特定的情况
谢谢。在你写这些之前,我已经这样做了。问题是,我起初只用Docker在本地尝试它。但用bluemix你可以得到音量。超过df,我推荐使用mount | grep nfs4。 – bartimar
使用nfs4你将依赖于技术,理论上它可以透明地改变,你的脚本不会编写脚本。使用像亚历克斯建议的卷名,它实际上更便携 –
我不关心卷名称。我关心有什么容量连接到容器内的/ var/lib/mysql ... – bartimar