如何检索由docker-compose.yml开头的确切容器名称

时间:2018-07-08 23:41:29

标签: shell docker-compose sh

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

问题是docker-compose为容器提供了动态名称-每次我们用'run'启动它们时它们都会改变。如何找到这次正在运行的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等,< / p>

如何找到要执行的确切名称?我找到了这个docker ps --format '{{.Image}} {{.Names}}',但其中列出了所有正在运行的容器,可能有多个......如何仅获取正在运行的db2容器的名称?

3 个答案:

答案 0 :(得分:1)

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

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

如果只需要db2,则可以运行:

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

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

要完成所需的操作,请在您的撰写文件中将标签添加到db2中,例如:

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

然后按标签过滤正在运行的容器的ID:

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

答案 1 :(得分:0)

您可以使用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命令一样,这些命令会严重破坏行。非交互式外壳不会有此问题,但是在终端仿真器中,您可能会看到命令失败。

答案 2 :(得分:0)

@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}";