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

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..."

需求

寻求以下两种解决方案:

  1. 修改相关文件权限,使其在远程仓库中拥有rwx权限
  2. 修改Dockerfile,忽略该脚本执行失败的错误,确保容器正常启动

解决方案

方案1:修复权限问题

报错核心是目标目录权限不足,脚本中指定的clonePath=/opt/clone/data/data未在Dockerfile中创建,且用户1001无该路径的读写权限。同时,若需确保远程仓库文件拥有可执行权限,可按以下步骤操作:

  1. 调整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问题。

  2. 修改远程仓库文件权限(若需)
    若仓库中部分文件需要可执行权限,在本地仓库目录执行:

    # 给单个文件添加可执行权限
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:20:40