这个问题的答案不起作用。
docker 容器总是在我可以
attach
之前退出,或者不接受 -t
标志。我可以列出我尝试过的所有命令,但它是 start
exec
attach
与各种 -it
标志和 /bin/bash
的组合。
如何将现有容器启动到 bash 中?为什么这么难?这是 Docker 的“不当”使用吗?
编辑: 我用
docker run ubuntu
创建了容器。容器信息:60b93bda690f ubuntu "/bin/bash" About an hour ago Exited (0) 50 minutes ago ecstatic_euclid
首先,容器不是虚拟机。容器是运行进程的隔离环境。容器的生命周期与其内部运行的进程绑定在一起。当进程退出时,容器也退出,隔离环境就没有了。 “附加到容器”或“进入容器”的含义实际上意味着你进入了正在运行的进程的隔离环境中,所以如果你的进程已经退出,你的容器也已经退出,因此没有容器可供你使用至
attach
或 enter
。所以docker attach
、docker exec
的命令是针对running容器的。
当您在
docker run
中配置Dockerfile
并构建到docker镜像中时,将启动哪个进程。以图像ubuntu
为例,如果运行docker inspect ubuntu
,您将在输出中找到以下配置:
"Cmd": ["/bin/bash"]
这意味着当你运行
docker run ubuntu
是/bin/bash
时进程就启动了,但是你不是处于交互模式,也没有为其分配tty,所以进程立即退出,容器也退出。这就是为什么你没有办法再次进入容器的原因。
要启动容器并输入
bash
,只需尝试:
docker run -it ubuntu
然后你将被带入容器外壳。如果您打开另一个终端并
docker ps
,您会发现容器正在运行,您可以 docker attach
进入它或 docker exec -it <container_id> bash
再次进入它。
您也可以参考此链接了解更多信息。
这是一个非常简单的 Dockerfile,其中包含注释形式的说明...启动它以启动一个正在运行的容器,您可以执行登录到
FROM ubuntu:20.04
ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get install -y
CMD ["/bin/bash"]
# ... save this file as Dockerfile then in same dir issue following
#
# docker build --tag stens_ubuntu . # creates image stens_ubuntu
#
# docker run -d stens_ubuntu sleep infinity # launches container
#
# docker ps # show running containers
#
#
# ... find CONTAINER ID from above and put into something like this
#
# docker exec -ti $( docker ps | grep stens_ubuntu | cut -d' ' -f1 ) bash # login to running container
# docker exec -ti 3cea1993ed28 bash # login to running container using sample containerId
#
容器在没有工作要做时会正常退出...如果你不给它任何工作,它会在启动时立即退出,因为这个原因...通常 Dockerfile 的最后一个命令是执行某种类型的服务器由于内部事件循环,它保持活动状态,并且这样做可以保持其封闭容器的活动状态...除此之外,您可以提及已安装到容器中的服务器可执行文件作为调用的最终参数
docker run -d my-image-name my-server-executable
Dockerfile 中的
RUN
命令默认始终使用 /bin/sh
。如果您想将单个命令更改为 bin\bash
,您可以使用:
RUN ["/bin/bash", "-c", "echo 'Hello from bash!'"]
如果您想更改整个构建的 shell,请使用:
SHELL ["/bin/bash", "-c"]