我用-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。我赢不了。


当前回答

所以我认为答案比上面许多误导性的答案更简单。

启动已停止的现有容器

docker start <container-name/ID>

停止正在运行的容器

docker stop <container-name/ID>

然后登录到容器的交互式shell

docker exec -it <container-name/ID> bash

在一个命令中启动一个现有容器并附加到它

docker start -ai <container-name/ID>

注意,这将在退出时停止容器。但通常情况下,您需要启动容器,在完成后附加并停止它。

其他回答

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 run --interactive --tty <name_of_image>

这里的一些答案具有误导性,因为它们涉及正在运行的容器,而不是停止的容器。

Sven Dowideit在Docker论坛上解释说,容器与它们的进程是绑定的(Docker不能改变一个停止的容器的进程,似乎至少是由于它的内部结构:https://github.com/docker/docker/issues/1437)。因此,基本上唯一的选择是将容器提交给一个映像,并用不同的命令运行它。

参见https://forums.docker.com/t/run-command-in-stopped-container/343 (我相信“带参数的ENTRYPOINT”方法也不能工作,因为您仍然不能将参数更改为停止的容器。)

创建一个容器并向其发送命令,一个接一个:

docker create --name=my_new_container -it ubuntu
docker start my_new_container
// ps -a says 'Up X seconds'
docker exec my_new_container /path/to/my/command
// ps -a still says 'Up X+Y seconds'
docker exec my_new_container /path/to/another/command

所以我认为答案比上面许多误导性的答案更简单。

启动已停止的现有容器

docker start <container-name/ID>

停止正在运行的容器

docker stop <container-name/ID>

然后登录到容器的交互式shell

docker exec -it <container-name/ID> bash

在一个命令中启动一个现有容器并附加到它

docker start -ai <container-name/ID>

注意,这将在退出时停止容器。但通常情况下,您需要启动容器,在完成后附加并停止它。