下面是docker容器正常退出,可以编辑Dockerfile时的解决方案。
通常,当运行 docker 容器时,通过运行命令来服务应用程序。从Dockerfile 参考,
CMD 和 ENTRYPOINT 指令都定义了运行容器时执行的命令。... Dockerfile 应至少指定 CMD 或 ENTRYPOINT 命令之一。
当您构建映像并且未使用 CMD 或 ENTRYPOINT 指定任何命令时,将执行基本映像的 CMD 或 ENTRYPOINT 命令。
例如,官方 Ubuntu Dockerfile 有CMD ["/bin/bash"]
( https://hub.docker.com/_/ubuntu )。现在,该bin/bash/
命令可以接受输入并且docker run -it IMAGE_ID
命令将 STDIN 附加到容器。结果是您获得了一个交互式终端,并且容器继续运行。
如果在 Dockerfile 中指定了带有 CMD 或 ENTRYPOINT 的命令,则在运行容器时会执行该命令。现在,如果这个命令可以在不需要任何输入的情况下完成,它将完成并且容器将退出。docker run -it IMAGE_ID
在这种情况下将不提供交互式终端。一个例子是从下面的 Dockerfile 构建的 docker 镜像 -
FROM ubuntu
ENTRYPOINT echo hello
如果你需要去这个镜像的终端,你需要通过修改入口点命令来保持容器运行。
FROM ubuntu
ENTRYPOINT echo hello && sleep infinity
使用 正常运行容器后docker run IMAGE_ID
,您可以转到另一个终端并使用docker exec -it CONTAINER_ID bash
获取容器的终端。