Docker容器无法忽略EntryPoint脚本执行失败问题求助
问题描述
Docker容器启动时,尽管已在EntryPoint中设置|| true试图将命令状态置为0,但仍因Bash脚本执行失败导致容器启动失败。
报错信息
Error: cp: cannot create regular file '/data/./.git/objects/pack/pack-27a9d...fb5e368e4cf.pack': Permission denied cp: cannot create regular file '/data/./.git/objects/pack/pack-27a9d...fbae25e368e4cf.idx': Permission denied
涉及脚本与Dockerfile
初始Bash脚本
clonePath=/data/config/ git branch -r | fgrep -v 'origin/HEAD' | sed 's| origin/|git checkout |' > checkoutAllBranches.sh chmod +x checkoutAllBranches.sh echo "Fetch branch: `cat checkoutAllBranches.sh`" ./checkoutAllBranches.sh git checkout master git remote rm origin rm checkoutAllBranches.sh for config_dir in `ls -a`; do cp -r $config_dir $clonePath/; done echo "API Config update complete..."
执行脚本的Dockerfile片段
ENTRYPOINT ["sh","config-update-force.sh","|| true"]
完整Dockerfile
FROM docker.hub.com/java11-temurin:latest USER root RUN apt-get update RUN apt-get -y upgrade RUN apt-get install -y rsync telnet vim wget git RUN mkdir -p /opt/config/clone/data RUN chown -R 1001:1001 /opt/config USER 1001 ADD build/libs/my-api-config-server.jar . ADD config-update-force.sh . USER root RUN chmod +x config-update-force.sh USER 1001 EXPOSE 8080 CMD java $BASE_JAVA_OPTS $JAVA_OPTS -jar my-api-config-server.jar ENTRYPOINT ["sh","config-update-force.sh","|| true"]
完整Bash脚本(config-update-force.sh)
#!/bin/bash set +e set +x clonePath=/opt/clone/data/data #source Optumfile.properties echo "properties loaded: example ${git_host}" if [ -d my-api-config ]; then rm -rf my-api-config; echo "existing my-api-config dir deleted..." fi git_url=https://github.com/my-api-config-server git clone https://github.com/my-api-config-server cd my-api-config-server git branch -r | fgrep -v 'origin/HEAD' | sed 's| origin/|git checkout |' > checkoutAllBranches.sh chmod +x checkoutAllBranches.sh echo "Fetch branch: `cat checkoutAllBranches.sh`" ./checkoutAllBranches.sh git checkout master git remote rm origin rm checkoutAllBranches.sh for config_dir in `ls -a`; do cp -r $config_dir $clonePath/; done echo "My API Config update complete..."
需求
寻求以下两种解决方案:
- 修改相关文件权限,使其在远程仓库中拥有rwx权限
- 修改Dockerfile,忽略该脚本执行失败的错误,确保容器正常启动
解决方案
方案1:修复权限问题
报错核心是目标目录权限不足,脚本中指定的clonePath=/opt/clone/data/data未在Dockerfile中创建,且用户1001无该路径的读写权限。同时,若需确保远程仓库文件拥有可执行权限,可按以下步骤操作:
调整Dockerfile,确保目标目录存在且权限正确
在Dockerfile的RUN chown -R 1001:1001 /opt/config之后添加:RUN mkdir -p /opt/clone/data/data && chown -R 1001:1001 /opt/clone这样能确保1001用户对
/opt/clone/data/data目录有读写权限,解决cp时的Permission denied问题。修改远程仓库文件权限(若需)
若仓库中部分文件需要可执行权限,在本地仓库目录执行:# 给单个文件添加可执行权限 git update-index --chmod=+x 目标文件名 # 提交并推送变更 git commit -m "Add execute permission to files" git push这样克隆到容器中的文件会自动带有可执行权限。
方案2:忽略脚本执行错误,确保容器启动
当前ENTRYPOINT的写法错误,|| true被当作参数传给sh而非shell语法解析,导致无法忽略脚本错误。需修改ENTRYPOINT的写法:
将Dockerfile中的ENTRYPOINT替换为:
ENTRYPOINT ["sh", "-c", "./config-update-force.sh || true"]
- 使用
sh -c让shell解析整个命令串,|| true会在脚本执行失败时强制返回0状态码,确保容器不会因脚本错误退出。 - 若希望脚本内遇到错误仍继续执行,可保留脚本中的
set +e(已存在),它会让脚本在单个命令失败时不立即终止。
内容的提问来源于stack exchange,提问作者Sunil N
相关产品推荐
相关产品推荐

