
ADD vs COPY 核心区别场景用什么示例复制本地文件到镜像COPYCOPY app.py /app/复制并自动解压 tar 包ADDADD rootfs.tar.gz /从 URL 下载文件RUN curl推荐RUN curl -o /x.sh https://...为什么推荐 COPYADD 行为不透明——传 tar 它解压传普通文件它不解压传目录它复制目录传 URL 它下载但不解压。容易踩坑。官方明确建议默认用 COPY。dockerfile# 推荐 COPY package.json /app/ COPY ./src /app/src # 仅当需要解压时用 ADD ADD rootfs.tar.xz / # 远程文件用 RUN curl 更可控能校验、能重试 RUN curl -fsSL https://example.com/app.tar.gz -o /tmp/app.tar.gz \ tar xzf /tmp/app.tar.gz -C /app \ rm /tmp/app.tar.gzCMD vs ENTRYPOINT 核心区别一句话CMD 可被docker run参数覆盖ENTRYPOINT 不会被覆盖参数追加到它后面。三种写法 实际效果dockerfile# 情况1只用 CMD CMD [nginx, -g, daemon off;] # docker run myimage → 执行 nginx -g daemon off; # docker run myimage bash → 执行 bashCMD 被整体替换 # 情况2只用 ENTRYPOINT ENTRYPOINT [nginx, -g, daemon off;] # docker run myimage → 执行 nginx -g daemon off; # docker run myimage -v → 执行 nginx -g daemon off; -v参数追加 # 情况3ENTRYPOINT CMD 配合最佳实践 ENTRYPOINT [nginx] CMD [-g, daemon off;] # docker run myimage → 执行 nginx -g daemon off;用 CMD 默认参数 # docker run myimage -t → 执行 nginx -tCMD 参数被替换程序不变最佳实践ENTRYPOINT固定主程序CMD提供默认参数。这样既保证容器一定跑你想跑的程序又允许运行时灵活调整参数。几个易踩的坑shell 格式 vs exec 格式CMD nginx -g daemon off;shell 格式会通过/bin/sh -c执行收不到 SIGTERM 信号容器停止会超时。生产环境用 exec 格式CMD [nginx, -g, daemon off;]。ENTRYPOINT 用 shell 格式会忽略 CMDENTRYPOINT nginx这种写法会让 CMD 完全失效因为 shell 格式会变成/bin/sh -c nginx。想覆盖 ENTRYPOINT用--entrypoint参数如docker run --entrypoint bash myimage。基础镜像有 ENTRYPOINT 你想替换在子 Dockerfile 里重新写ENTRYPOINT会覆盖父镜像的。