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


当前回答

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

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

所以你的新运行命令是:

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

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

docker exec -it CONTAINER_ID /bin/bash

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

其他回答

将一个命令管道到docker exec bash stdin

必须删除-t才能工作:

echo 'touch myfile' | docker exec -i CONTAINER_NAME bash

有时这比使用CLI选项更方便。

测试:

docker run --name ub16 -it ubuntu:16.04 bash

然后在另一个壳上:

echo 'touch myfile' | docker exec -i ub16 bash

然后在第一能层

ls -l myfile

在Docker 1.13.1, Ubuntu 16.04主机上测试。

我必须使用bash -c来运行我的命令: docker exec - CONTAINER_ID bash "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"

我想指出,上面的答案有点误导人。

执行docker run的问题是每次都会创建一个新的容器。然而,在某些情况下,我们希望重新访问旧容器或不占用新容器的空间。

(给定clever_bardeen是创建的容器的名称…)

在OP的情况下,通过执行以下命令确保docker映像首先运行:

docker start clever_bardeen

然后,使用以下命令执行docker容器:

docker exec -it clever_bardeen /bin/bash

一个简单的解决方案为我解决了类似的问题:

docker run --interactive --tty <name_of_image>

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

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