如何强制IBM Bluemix中的Docker容器连接卷?

有什么办法可以拒绝启动一个没有连接到特定path的容器的容器吗?

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

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

容器卷包含装载path中容器的名称,所以基本上可以在Dockerfile中创build一个入口点脚本来检查卷名是否存在。 我用df | grep volume-name 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 

我build议你不要使用一个常用的名字,比如“data”,或者grep会匹配这个名字。

这是我做的步骤:

  1. 创build一个入口点脚本,使用df命令检查卷的存在(请参阅下面的示例entrypoint.sh文件)
  2. 创buildDockerfile并添加ENTRYPOINT命令来运行入口点脚本(请参阅下面的示例Dockerfile文件)
  3. 创build一个新图像并推送到您的Bluemixregistry,例如:

    $ 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. 创build卷 – 卷的名称与入口点脚本中的检查匹配,例如:

    $ cf ic volume create adsdatabase

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

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

如果在创build容器时不添加卷,容器将会失败并在几分钟内自动closures。

entrypoint.sh

 #!/bin/bash set -e if df | grep adsdatabase > /dev/null; then echo "Found volume" else echo "Volume not found" exit 1 fi exec "$@" 

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"] 

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