我用-d创建了一个容器,所以它不是交互式的。

docker run -d shykes/pybuilder bin/bash

我看到容器已经退出:

CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS                      PORTS               NAMES
d6c45e8cc5f0        shykes/pybuilder:latest   "bin/bash"          41 minutes ago      Exited (0) 2 seconds ago                        clever_bardeen

现在我想偶尔在机器上运行一些命令,然后退出。只是为了得到回应。

我试着启动机器。我试着连接。我以为我可以调用运行与容器,但这似乎不被允许。使用start似乎只是运行,然后迅速存在。

退出后,我想回到交互模式。

我试着:

docker attach d6c45e8cc5f0

但我明白:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first

但如果我启动它,它还是会退出。赶上22。我赢不了。


当前回答

2014年10月,Docker团队引入了Docker exec命令:https://docs.docker.com/engine/reference/commandline/exec/

所以现在你可以在一个运行的容器中运行任何命令,只需要知道它的ID(或名称):

docker exec -it <container_id_or_name> echo "Hello from container!"

注意,exec命令只对已经运行的容器有效。如果容器当前处于停止状态,则需要先运行以下命令:

docker run -it -d shykes/pybuilder /bin/bash

这里最重要的是-d选项,它代表分离。这意味着您最初提供给容器的命令(/bin/bash)将在后台运行,容器不会立即停止。

其他回答

# docker exec -d container_id command 

Ex:

# docker exec -d xcdefrdtt service jira stop 

为了扩展katrmr的答案,如果容器由于错误而停止并且无法启动,则需要将其提交给一个映像。然后你可以在新镜像中启动bash:

docker commit [CONTAINER_ID] temporary_image
docker run --entrypoint=bash -it temporary_image

您的容器将退出,因为您给它的命令将结束。使用以下选项来保持它的活性:

-i保持STDIN打开,即使没有附加。 -t分配伪tty。

所以你的新运行命令是:

docker run -it -d shykes/pybuilder bin/bash

如果你想附加到一个已经运行的容器:

docker exec -it CONTAINER_ID /bin/bash

在本例中,命令使用/bin/bash。

假设映像使用默认的入口点/bin/sh -c,运行/bin/bash将立即以守护模式(-d)退出。如果您希望这个容器运行交互式shell,请使用-it而不是-d。如果你想在一个容器中执行任意命令,通常是执行另一个进程,你可能想尝试nsenter或nsinit。详情请访问https://blog.codecentric.de/en/2014/07/enter-docker-container/。

这是我用上面的CDR LDN答案和我在这里找到的答案组合起来的答案。

下面的例子从一个镜像启动一个Arch Linux容器,然后使用pacman工具在该容器上安装git:

sudo docker run -it -d archlinux /bin/bash
sudo docker ps -l
sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm"

仅此而已。