因此,我试图动态运行下面的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 的灵感来自这篇关于如何将您的服务器/容器视为牛而不是宠物的文章
您可以使用--name选项在运行容器时为其指定一个特定的名称。
docker run --name mycontainer ...
Run Code Online (Sandbox Code Playgroud)
然后,您的exec命令可以使用指定的名称:
docker exec -it mycontainer ...
Run Code Online (Sandbox Code Playgroud)
我只是想出了一种方法来做到这一点。我经常用 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)
过滤器的文档在这里。希望能帮助某人。