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

Docker容器entrypoint脚本执行unzip失败但手动执行正常问题排查

问题根因
  • Dockerfile工作目录配置错误:RUN指令仅会保留文件系统变更,执行过程中的shell上下文(包括当前工作目录)不会被继承,你写的RUN cd jobs/执行完成后立即失效,容器启动后的默认工作目录为根目录/,而非/jobs。
  • shell脚本路径依赖问题:脚本内所有操作均使用相对路径,只有执行脚本时的当前工作目录为/jobs才能正常运行。你手动进入容器执行脚本时会先切换到/jobs目录,因此执行正常;但容器启动时默认工作目录为/,脚本在根目录下找不到压缩包、解压后的test目录等文件,因此报错。
修复方案

两种方案二选一即可:

方案1:修改Dockerfile指定工作目录(无需改动脚本)

将Dockerfile中的RUN cd jobs/替换为WORKDIR /jobs,WORKDIR指令会永久设置后续所有构建指令、容器运行时的默认工作目录。修改后的Dockerfile配置如下:

RUN mkdir /jobs
COPY test_0.1.zip /jobs/test_0.1.zip
COPY entrypoint.sh /jobs/
WORKDIR /jobs
CMD [ "/jobs/entrypoint.sh" ]

方案2:修改shell脚本固定工作目录(无需改动Dockerfile)

在entrypoint.sh开头添加工作目录切换逻辑,避免脚本依赖执行时的上下文环境,修改后的脚本如下:

#!/bin/bash
# 固定切换到脚本所在目录,执行失败直接退出避免后续报错
cd /jobs || exit 1

function setup()
{
echo "Preparing files for job execution"
unzip test_0.1.zip
}
setup &
b=$!
wait $b
cd test/
chmod +x test_run.sh
./test_run.sh

建议脚本统一添加#!/bin/bash作为首行,避免默认shell不兼容导致的语法错误。

额外优化建议

如果不需要每次启动容器都重新解压压缩包,可以直接在构建阶段完成解压操作,无需放到entrypoint中执行,减少容器启动耗时:

RUN mkdir /jobs
COPY test_0.1.zip /jobs/test_0.1.zip
WORKDIR /jobs
# 构建阶段直接解压并赋予执行权限
RUN unzip test_0.1.zip && chmod +x test/test_run.sh
COPY entrypoint.sh /jobs/
CMD [ "/jobs/entrypoint.sh" ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:18:04