【问题标题】:Dynamically get a running container id/name created by docker run command动态获取 docker run 命令创建的正在运行的容器 id/name
【发布时间】:2018-02-12 08:46:10
【问题描述】:

所以我正在尝试运行以下 shell 脚本,该脚本需要动态的容器(脚本将在其中运行)的容器 ID/名称。

一种方法是执行 docker ps 然后获取容器 ID,但这不是动态的。

那么有没有办法动态地做到这一点?

#!/bin/bash
docker exec <container id/name> /bin/bash -c "useradd -m <username> -p <password>"

【问题讨论】:

标签: linux bash docker


【解决方案1】:

您可以在使用 --name 选项运行容器时为其指定一个特定名称。

docker run --name mycontainer ...

那么你的exec命令就可以使用指定的名字了:

docker exec -it mycontainer ...

【讨论】:

  • 那么它将仅限于该容器。但我可以从任何容器运行脚本。
  • @Nobita 如果您有 2 个不同的容器正在运行,您如何(手动)知道您希望脚本在哪个容器中运行。是容器映像还是其他什么?
  • 假设我们有多个容器用于同一个图像,我们不知道我们从哪个容器运行脚本(因为它们都是相同的)
  • 你没有回答这个问题。您如何知道要连接到哪一个?一个常见的技巧是docker ps -l -q,它可以让您获得您启动的最新容器的 id,但显然这不一定是您想要的。
【解决方案2】:

您可以启动容器并将容器 ID 存储在变量中,如下所示:

container_id=$(docker run -it --rm --detach busybox)

然后你可以像这样在docker exec 命令中使用容器ID:

docker exec $container_id ls -la

docker stop $container_id

注意:不要为容器使用(唯一)名称,而是使用 ID 是受这篇关于如何将服务器/容器视为 cattle and not pets

的文章的启发

【讨论】:

    【解决方案3】:

    我刚刚找到了一种适用于此的方法。我经常在 bash 中进入我的容器,但每次我这样做时,我都必须查找正在运行的容器的 id——这让我很头疼。我像这样使用--filter 命令:

    docker ps -q --filter="NAME={name of container}"
    

    那么唯一输出的是容器的 id,它允许我运行:

    docker exec -it $(docker ps -q --filter="NAME={name of container}") bash
    

    这是我在这种情况下真正想做的。

    您可以通过过滤

    id, name, label, exited, status, ancestor, 
    beforesince, volume, network, publishexpose, 
    health,isolation, or is-task
    

    过滤器的文档是here。希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-10-07
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 2021-06-23
      • 2020-06-11
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多