【问题标题】:How to force a docker container in IBM Bluemix to connect a volume?如何强制 IBM Bluemix 中的 docker 容器连接卷?
【发布时间】:2016-02-18 14:31:24
【问题描述】:

有没有办法拒绝启动一个没有卷连接到某个路径的容器?

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

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

【问题讨论】:

    标签: docker containers ibm-cloud


    【解决方案1】:

    容器卷在装载路径中包含容器的名称,因此基本上您可以在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
    

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

    如果在创建容器时不添加卷,容器会出现故障,几分钟后会自动关闭。

    入口点.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"]
    

    【讨论】:

    • 谢谢。在你写之前我已经这样做了。问题是,我一开始只在本地尝试使用 Docker。但是使用 bluemix,您可以获得音量。多于df,我推荐mount | grep nfs4.
    • 使用 nfs4 您将取决于技术,理论上它可以透明地更改并且您的脚本不会编写脚本。使用 Alex 建议的卷名,确实更便携
    • 我不关心卷名。我关心将任何卷连接到容器内的 /var/lib/mysql...
    【解决方案2】:

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

    【讨论】:

    • 如何从容器内部检查完全在容器外的东西?
    • 或者你的意思是想先在连接的卷中放一些东西?然后启动容器检查它是否存在?
    • 完全正确。您可以检查已安装的文件系统,并且 Bluemix 卷是通过 NFS 安装的,但它并不是真正可移植的。所以你可以更便携的是检查卷安装点的内容,当它被初始化时(创建数据库并插入数据):这意味着当你的容器启动时将检查路径 /var/lib/mysql (如果它是卷挂载点)并且如果为空(因此卷尚未附加到容器)将不会启动 mysql 数据库
    • 这实际上是更多的工作(我需要一个管理员来强迫他创建卷并在其中上传一些东西或为它制作一个脚本),而不是仅仅强迫开发人员检查,如果他没有忘记的话连接音量。上面接受的答案是更好的解决方案。
    • 检查已安装的设备是我要运行的步骤之一。第二步应该是挂载的路径内容:你的卷可能是空的,所以你应该检查内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多