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
相关产品推荐
相关产品推荐

