Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何强制IBM Bluemix中的docker容器连接卷?_Docker_Containers_Ibm Cloud - Fatal编程技术网

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

如何强制IBM Bluemix中的docker容器连接卷?,docker,containers,ibm-cloud,Docker,Containers,Ibm Cloud,有没有办法拒绝启动没有卷连接到特定路径的容器 我有一个mysql容器,希望阻止启动容器(退出时出错),因为没有卷连接到/var/lib/mysql到主机卷。IBMBlueMix中有一个选项,用于使用容器的指定路径向容器添加卷。如果有人忘记添加卷,我需要防止启动容器 或者,是否可以从容器内部找出从主机到容器的卷?(向入口点添加检查)您只需运行一个脚本,检查应该装入卷的路径(在您的示例中为/var/lib/mysql)是否包含卷内容(它确认卷已正确装入) 请记住: -即使卷未装入,卷装入路径也存在,

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

我有一个mysql容器,希望阻止启动容器(退出时出错),因为没有卷连接到/var/lib/mysql到主机卷。IBMBlueMix中有一个选项,用于使用容器的指定路径向容器添加卷。如果有人忘记添加卷,我需要防止启动容器


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

您只需运行一个脚本,检查应该装入卷的路径(在您的示例中为/var/lib/mysql)是否包含卷内容(它确认卷已正确装入) 请记住: -即使卷未装入,卷装入路径也存在,您必须检查其内容,而不是路径本身
-如果您在第一次启动卷时运行初始化过程,您可能会认为此时卷是空的,装载点也是空的:因此,在初始化时跳过检查,或者对此容器有一个特定的案例。容器卷在装载路径中包含容器的名称,因此,基本上您可以在
Dockerfile
中创建一个入口点脚本来检查卷名是否存在。我使用
df | grep volume name
检查卷是否装载在入口点脚本中。 这是在已装入卷的容器上运行
df
的示例(此处的卷是adsdatabase):

我建议您不要使用诸如“data”之类的通用名称作为卷名,否则grep将与之匹配

以下是我所做的步骤:

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

    $docker build-t广告卷示例。
    $docker tag ads volumesample registry.ng.bluemix.net/namespace/ads-volumesample
    $docker push registry.ng.bluemix.net/namespace/ads volumesample

  • 创建卷-卷的名称与入口点脚本中的检查匹配,例如:

    $cf ic卷创建ADS数据库

  • 创建新容器并添加新卷:

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

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

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

    我如何从容器内部检查完全位于容器外部的内容?或者您的意思是,首先在连接的卷中检查内容?然后启动容器检查它是否在那里?准确地说。您可以检查是否有已装入的文件系统,Bluemix卷是通过NFS装入的,但它不是真正可移植的。因此,您可以更方便地检查卷装入点的内容,当它需要初始化时(创建数据库并插入数据):这意味着当您的容器启动时,将检查路径/var/lib/mysql(如果它是卷装入点)和是否为空(因此卷尚未连接到容器)将不会启动mysql数据库,这实际上比强迫开发人员检查他是否没有忘记连接卷还需要更多的工作(我需要一个管理员来强制他创建卷并在其中上载内容或为其制作脚本)。以上公认的答案是更好的解决方案。检查安装的设备是我将运行的步骤之一。第二步应该是装载路径内容:您的卷可能为空,因此您应该检查内容。谢谢。在你写之前我已经这样做了。问题是,我一开始只是在本地用Docker进行尝试。但使用bluemix,您可以获得音量。除了df,我推荐挂载| grep nfs4。使用nfs4,您将依赖于技术,从理论上讲,它可以透明地更改,而您的脚本不会编写脚本。使用Alex建议的卷名,它实际上更便于携带。我不在乎卷名。我关心的是在容器中连接到/var/lib/mysql的任何卷。。。
    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"]