參考: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
指令不執行的情況。
希望這個解釋對您有所幫助。如果您還有其他問題,請隨時告訴我!