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

How to force a docker container in IBM Bluemix to connect a volume?

有没有办法拒绝启动没有卷连接到特定路径的容器?

我有一个 mysql 容器,我想在没有卷连接到 /var/lib/mysql 主机卷的情况下阻止启动容器(出现错误退出)。 IBM Bluemix 中有一个选项,用于将卷添加到具有容器指定路径的容器中。如果有人忘记添加卷,我需要防止启动容器。

或者,是否可以从容器内部查看是否存在从主机到容器的卷? (向入口点添加检查)

您可以简单地 运行 一个脚本来检查应该安装卷的路径(/var/lib/mysql 在您的情况下)是否包含卷内容(它确认卷已正确安装) 请记住: - 即使未安装卷,卷安装路径也存在,您必须检查其内容而不是路径本身 - 如果您 运行 在您第一次启动卷时进行初始化过程,您可能会认为在那一刻卷是空的并且挂载点也是空的:因此在初始化时跳过检查,或者有一个特定的案例这个

容器卷在安装路径中包含容器的名称,因此基本上您可以在 Dockerfile 中创建一个入口点脚本来检查卷名称是否存在。我使用 df | grep volume-name 检查入口点脚本中是否安装了卷。 这是 运行ning 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

我建议您不要为卷名称使用通用名称,例如 "data",否则 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

如果在创建容器时不添加volume,容器会失败并在几分钟后自动关闭。

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 "$@"

Docker 文件

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