Dockerfile执行的时候没有执行CMD

参考: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 -itddocker 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 -itddocker run -d不包含-i-t参数,因此不会为容器分配伪终端,也不会打开交互式会话。在这种情况下,Docker会默认执行Dockerfile中的CMD指令,作为容器启动时的默认命令。

因此,如果您想要让Docker忽略交互式会话,且直接执行Dockerfile中的CMD指令,可以尝试使用docker run -d命令来启动容器。这样可以避免因为分配伪终端而导致CMD指令不执行的情况。

希望这个解释对您有所帮助。如果您还有其他问题,请随时告诉我!

相关推荐
摇滚侠10 分钟前
IDEA 创建 Java 项目 推送到远程 Git 仓库
java·git·intellij-idea
可乐ea14 分钟前
【知识获取与分享社区项目 | 项目日记第 24 天】终章总结:从认证、发布、计数、Feed、搜索到 RAG:完整复盘一个知识社区后端系统
java·spring boot·redis·mysql·elasticsearch·ai·kafka
Jabes.yang21 分钟前
Java面试实录:AIGC场景下的Stream、微服务、Redis、Kafka与安全实战
java·spring boot·redis·微服务·面试·kafka·aigc
lwf00616422 分钟前
实战:用 Java 模拟登录阿里云控制台,爬取没有 OpenAPI 的数据
java·阿里云
努力搬砖的咸鱼32 分钟前
容器编排底层原理:Kubernetes 网络模型与 CNI 插件
网络·微服务·云原生·容器·架构·kubernetes
Plastic garden32 分钟前
K8s介绍(2)POD架构
云原生·容器·kubernetes
程序员二叉33 分钟前
【Java】 面试核心合集:BigDecimal、缓存池、多态、反射全解析
java·缓存·面试
Full Stack Developme37 分钟前
SpringMVC multipart 文件上传
java·开发语言
西凉的悲伤42 分钟前
Spring Security + JWT 登录认证完整实践指南
java·后端·spring·spring security·jwt
晚笙coding42 分钟前
从零讲透 LangChain 输出格式化:让模型真的“能用”
java·开发语言·langchain