You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker ENTRYPOINT无法执行镜像构建时添加的Shell脚本问题排查

Docker ENTRYPOINT执行时机与容器启动脚本找不到问题排查

问题描述

跟随Jeff Nickoloff和Stephen Kuenzli所著的《Docker in Action》一书实操部署日志程序,操作步骤如下:

  • 使用mailer-base.df构建自定义基础镜像dockerinaction/mailer-base:0.6,镜像中ENTRYPOINT设置为/app/mailer.sh,但构建基础镜像时并未将该脚本放入镜像内;
  • 创建mailer-logging.df,包含安装netcat、复制log-impl目录、设置权限等指令,同时指定CMD为/var/log/mailer.log;
  • 在Dockerfile所在目录创建log-impl文件夹,并将mailer.sh脚本放入其中;
  • 基于mailer-logging.df构建镜像并运行容器logging-mailer,容器启动失败,日志报错:exec /app/mailer.sh: no such file or directory

已尝试调整环境变量和COPY语句,但问题未解决,需明确两个问题:

  1. ENTRYPOINT的执行时机是基础镜像构建时还是容器运行时?
  2. 为何会出现找不到脚本的错误?

回答

1. ENTRYPOINT的执行时机

ENTRYPOINT是容器运行时才会执行的指令。镜像构建阶段仅会把ENTRYPOINT的配置写入镜像元数据,不会实际执行该命令。只有当基于镜像启动容器时,Docker才会尝试执行ENTRYPOINT指定的程序或脚本。

2. 脚本找不到的错误原因

出现exec /app/mailer.sh: no such file or directory错误,核心是容器启动时/app/mailer.sh路径确实不存在,常见排查方向:

  • COPY路径配置错误:检查mailer-logging.df中的COPY指令,确认是否将log-impl目录下的mailer.sh复制到了/app目录。比如如果COPY语句是COPY log-impl/ /var/log-impl/,脚本会被放到/var/log-impl/mailer.sh而非/app/mailer.sh,需修正为COPY log-impl/mailer.sh /app/或COPY log-impl/ /app/(若log-impl下只有该脚本)。
  • 目标目录未创建:基础镜像仅定义了ENTRYPOINT路径,但未创建/app目录,需确认子镜像中是否通过RUN指令创建了该目录,或COPY操作是否自动生成(Docker的COPY指令会自动创建目标路径的父级目录,但路径写错则不会)。
  • 脚本shebang不匹配:如果脚本开头是#!/bin/bash,但子镜像未安装bash(比如alpine镜像默认只有sh),也可能触发类似错误,此时报错通常指向解释器而非脚本本身,可排查脚本shebang是否与镜像环境匹配。

内容的提问来源于stack exchange,提问作者B3T0N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:31:19