赞
踩
参考:https://blog.csdn.net/Zx13170918986/article/details/130831052
在dockerfile中编写CMD后,发现如果执行docker run -itd这样的指令,是没法启动CMD脚本的,例如以下的dockerfile
FROM node:16
WORKDIR /home/
COPY start_server.sh ./start_server.sh
CMD ["nohup", "./start_server.sh", "&"]
原因是“使用 docker run -it 命令启动容器时,默认情况下会覆盖 Dockerfile 中定义的 CMD 指令。”
以下回答来自GPT:
docker run -itd
和docker run -d
在Docker运行容器时确实有一些不同之处,主要涉及到交互性和终端的设置。- docker run -itd
:
-i
:表示要打开一个交互式会话。-t
:为容器分配一个伪终端(pseudo-TTY)。-d
:在后台运行容器。当您使用docker run -itd
时,会分配一个伪终端(TTY),也就是分配一个终端。这样容器会以后台模式运行,但是也会打开一个伪终端。由于分配了伪终端,Docker会认为您可能会需要交互式会话,因此不会执行Dockerfile中的CMD
指令,因为Docker理解您可能会手动输入命令。
docker run -d
:
-d
:在后台模式运行容器。相对于docker run -itd
,docker run -d
不包含-i
和-t
参数,因此不会为容器分配伪终端,也不会打开交互式会话。在这种情况下,Docker会默认执行Dockerfile中的CMD
指令,作为容器启动时的默认命令。
因此,如果您想要让Docker忽略交互式会话,且直接执行Dockerfile中的CMD
指令,可以尝试使用docker run -d
命令来启动容器。这样可以避免因为分配伪终端而导致CMD
指令不执行的情况。
希望这个解释对您有所帮助。如果您还有其他问题,请随时告诉我!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。