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

标签 shell docker-compose sh

我们有一个 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 容器的名称?

最佳答案

您可以使用 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 不会有这个问题,但在终端模拟器中,您可能会看到您的命令失败。

关于shell - 如何检索由 docker-compose.yml 开始的确切容器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51236780/

相关文章:

git - 如何获取 git SHA 的关联引用路径?

bash - 使用更改后的提示 PS1 启动 bash 进程

docker - 说 “Building <service>”后阻止Docker-compose构建

mysql - 无法通过 Kubernetes 集群中的主机名连接到 MariaDB

linux - sh 中的小型安装脚本

python - 为什么我在这里需要 shell=True 才能让 Python 的 subprocess.check_output 工作?

linux + 如何仅从行中删除匹配的数字

docker - 在 docker-compose 中添加wiremock扩展

Bash - 解压缩 : command not found

macOS 命令无法访问 a.jar