我用-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 start <container-name/ID>
停止正在运行的容器
docker stop <container-name/ID>
然后登录到容器的交互式shell
docker exec -it <container-name/ID> bash
在一个命令中启动一个现有容器并附加到它
docker start -ai <container-name/ID>
注意,这将在退出时停止容器。但通常情况下,您需要启动容器,在完成后附加并停止它。
将一个命令管道到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主机上测试。
我想指出,上面的答案有点误导人。
执行docker run的问题是每次都会创建一个新的容器。然而,在某些情况下,我们希望重新访问旧容器或不占用新容器的空间。
(给定clever_bardeen是创建的容器的名称…)
在OP的情况下,通过执行以下命令确保docker映像首先运行:
docker start clever_bardeen
然后,使用以下命令执行docker容器:
docker exec -it clever_bardeen /bin/bash