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语句,但问题未解决,需明确两个问题:
- ENTRYPOINT的执行时机是基础镜像构建时还是容器运行时?
- 为何会出现找不到脚本的错误?
回答
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
相关产品推荐
相关产品推荐

