动态获取由docker run命令创建的运行中容器ID /名称

Nob*_*ita 6 linux bash docker

因此,我试图动态运行下面的shell脚本,该脚本需要容器的容器ID /名称(将在其中运行脚本)。

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

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

#!/bin/bash
docker exec <container id/name> /bin/bash -c "useradd -m <username> -p <password>"
Run Code Online (Sandbox Code Playgroud)

小智 10

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

container_id=$(docker run -it --rm --detach busybox)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在docker exec命令中使用容器 ID,如下所示:

docker exec $container_id ls -la
Run Code Online (Sandbox Code Playgroud)

或者

docker stop $container_id
Run Code Online (Sandbox Code Playgroud)

注意:不为容器使用(唯一)名称而是使用 ID 的灵感来自这篇关于如何将您的服务器/容器视为牛而不是宠物的文章


yam*_*enk 9

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

docker run --name mycontainer ...
Run Code Online (Sandbox Code Playgroud)

然后,您的exec命令可以使用指定的名称:

docker exec -it mycontainer ...
Run Code Online (Sandbox Code Playgroud)

  • 您没有回答这个问题。您怎么*会*知道要连接哪一个?一个常见的窍门是docker ps -l -q,它可以为您获取您启动的最新容器的ID,但显然这不一定是您想要的。 (3认同)

dgo*_*dgo 5

我只是想出了一种方法来做到这一点。我经常用 bash 进入我的容器,但每次我都必须查找正在运行的容器的 id - 这很麻烦。我--filter像这样使用命令:

docker ps -q --filter="NAME={name of container}"
Run Code Online (Sandbox Code Playgroud)

然后输出的唯一内容是容器的 id,它允许我运行:

docker exec -it $(docker ps -q --filter="NAME={name of container}") bash
Run Code Online (Sandbox Code Playgroud)

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

你可以过滤

id, name, label, exited, status, ancestor, 
beforesince, volume, network, publishexpose, 
health,isolation, or is-task
Run Code Online (Sandbox Code Playgroud)

过滤器的文档在这里。希望能帮助某人。