【问题标题】:How do I retrieve the exact container name started by docker-compose.yml如何检索由 docker-compose.yml 启动的确切容器名称
【发布时间】:2018-07-08 23:41:29
【问题描述】:

我们有一个 docker-compose.yml 文件来启动一个 db2 和我们测试框架的许多其他组件。启动 db2 后,我们必须附加到该容器并在其上运行一组 shell 脚本以创建模式定义等。

问题在于 docker-compose 为容器提供动态名称 - 每次我们用“运行”启动它们时它们都会改变。如何找到这次运行的 db2 容器的确切名称?!

这是我们 docker-compose.yml 的摘录:

  db2:
    container_name: "bluecost-db2"
    image: store/ibmcorp/db2_developer_c:11.1.3.3-x86_64
    command: /bin/bash -c "groupadd bluecost -g 1006;adduser bluecost -u $$(id -u)  -g $$(echo $$(id)| grep -oPm1 'gid=\K\w+')&& echo \"bluecost:bluecost\" | chpasswd;usermod -a -G db2iadm1 bluecost;chown -R bluecost:db2iadm1 /home/bluecost/bluecostDB;mkdir /database/data;"
    hostname: db2server
    privileged: true
    ports:
      - 50001:50000
      - 55000:55000
    networks:
      - back-tier
    volumes:
      - ./standalone/linuxScripts/bluecostDB:/home/bluecost/bluecostDB
    restart: "no"
    env_file:
      - ./standalone/db2/.env_list

这是一个启动 db2 和其余命令的 shell 脚本:

docker-compose -f docker-acceptance.yml run -d db2
printf  "Waiting for db2 to warm-up *************************\n\n\n\n"
sleep 340
printf  "Starting to initialize schema **********************\n\n\n\n"
docker exec -d -t bluecost-db2 /bin/bash -c "cp /home/bluecost`/bluecostDB/*.* /home/db2inst;chmod +x /home/mydir/runBlueCostDBScript.sh;chown db2adm:db2adm /home/db2iadm/*.sql;chown db2adm:db2adm1 /home/db2inst/*.sh;mkdir /database/data/bluecostDB;chown -R db2adm:db2adm1 /database/data/bluecostDB;echo ./runBlueCostDBScript.sh | su - db2adm"` 

请注意,该脚本中的第一行上方运行 db2。这可行,容器启动并预热,但是当最后一个 docker exec 命令运行时,它通过名称“bluecost-db2”引用该容器,并且正在运行的容器名称略有不同:bluecost-db2_run1、bluecostdb2_run2 等

如何找到要执行的确切名称?我找到了这个docker ps --format '{{.Image}} {{.Names}}',但它列出了所有正在运行的容器,可能不止一个......我如何只获得正在运行的 db2 容器的名称?

【问题讨论】:

    标签: shell docker-compose sh


    【解决方案1】:

    你可以使用docker-compose ps:

    $ docker-compose ps
                    Name                               Command                   State                       Ports                
    ------------------------------------------------------------------------------------------------------------------------------
    our-project_airflow-postgres_1  docker-entrypoint.sh postgres    Up (healthy)     5432/tcp                                                                                                                             
    our-project_airflow_1           /bin/bash -c source initia ...   Exit 0                                                                       
    our-project_healthchecker_1     /bin/sh -c ./compute-healt ...   Up (unhealthy)                                       
    our-project_local-ingress_1     docker-entrypoint.sh postgres    Up (healthy)     5432/tcp                            
    our-project_local-s3_1          /usr/bin/docker-entrypoint ...   Up (healthy)     9000/tcp  
    

    您也可以将其限制为服务:

    $ docker-compose ps local-s3
                 Name                           Command                  State               Ports         
    -------------------------------------------------------------------------------------------------------
    gears-orchestration_local-s3_1   /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    
    

    所以你想要的是这样的东西:

    $ docker-compose ps local-s3 | tail -n +3 | awk '{ print $1 }'
    gears-orchestration_local-s3_1
    

    请注意,与所有docker CLI 命令一样,这些命令会主动换行。非交互式 shell 不会有这个问题,但在终端模拟器中,您可能会看到命令失败。

    【讨论】:

      【解决方案2】:

      您可以使用获取正在运行的容器的名称

      docker ps --format "{{.Image}} {{.Name}}" --filter status=running
      

      如果你只想要 db2,你可以运行:

      docker ps --format "{{.Image}} {{.Name}}" --filter status=running | grep db2
      

      您可以获取要执行命令的正在运行的 db2 容器的名称,将名称导出为变量并在脚本中引用 var,在正确的容器上执行命令

      要完成您想要的操作,请在 compose 文件中为 db2 添加标签,例如:

      env_file:
          - ./standalone/db2/.env_list
      labels:
          - db2.name: "db2"
      

      然后通过标签过滤运行容器的ID:

      docker ps --filter "label=db2" --format {{.ID}} --filter status=running
      

      【讨论】:

      • 当然,如果您需要帮助实施,请告诉我,很乐意提供帮助
      • 为什么这不起作用:docker ps --format '{{.ID}}' --filter status=running | grep db2 ?这虽然有效: docker ps --format '{{.ID}} {{.Names}}' --filter status=running | grep db2 - 为什么不只是 ID?
      • 因为它只返回容器的 ID,您需要过滤 {{.Name}} 以 grep 名称
      • 更新了过滤标签为 db2 的运行容器 id 的答案
      • 结果:failed to execute template: template: :1:13: executing "" at <.Name>: can't evaluate field Name in type *formatter.ContainerContext
      【解决方案3】:

      @Raphael 的答案对我很有效(应该被选为最佳答案,恕我直言)。

      我的用例:

      (1) 将输出分配给一个变量并 (2) 运行另一个 docker 命令在给定容器内执行某些操作。

      WEB_CONTAINER=`docker-compose ps local-s3 | tail -n +3 | awk '{ print $1 }'`;
      docker exec "${WEB_CONTAINER}" /bin/bash -c "echo ${whoami}";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 2018-04-22
        相关资源
        最近更新 更多