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

Docker容器中JGit克隆失败:无法创建.git目录求助

问题描述

我使用JGit库实现Git仓库的克隆与拉取功能,克隆代码如下:

Git.cloneRepository()
        .setURI(remoteURL)
        .setDirectory(repoDir)
        .setCredentialsProvider(credentialsProvider)
        .call();

这段代码在IntelliJ IDE中运行正常,但在Docker容器中运行时抛出如下错误:

Caused by: java.io.IOException: Creating directories for /app/policyrepo/.git failed
2024-10-22T10:19:02.949264300Z  at org.eclipse.jgit.util.FileUtils.mkdirs(FileUtils.java:421) ~[org.eclipse.jgit-6.10.0.202406032230-r.jar:6.10.0.202406032230-r]
2024-10-22T10:19:02.949265500Z  at org.eclipse.jgit.internal.storage.file.FileRepository.create(FileRepository.java:231) ~[org.eclipse.jgit-6.10.0.202406032230-r.jar:6.10.0.202406032230-r]
2024-10-22T10:19:02.949266700Z  at org.eclipse.jgit.api.InitCommand.call(InitCommand.java:103) ~[org.eclipse.jgit-6.10.0.202406032230-r.jar:6.10.0.202406032230-r]
2024-10-22T10:19:02.949267900Z  ... 27 common frames omitted

我使用Jib插件构建Docker镜像,配置如下:

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>${jib-maven-plugin.version}</version>
    <configuration>
        <allowInsecureRegistries>true</allowInsecureRegistries>
        <from>
            <image>${jib-maven-plugin.image}</image>
            <platforms>
                <platform>
                    <architecture>${jib-maven-plugin.architecture}</architecture>
                    <os>linux</os>
                </platform>
            </platforms>
        </from>
        <to>
            <image>vauthz/vauthz-be</image>
        </to>
        <container>
            <entrypoint>
                <shell>bash</shell>
                <option>-c</option>
                <arg>/entrypoint.sh</arg>
            </entrypoint>
            <environment>
                <SPRING_OUTPUT_ANSI_ENABLED>ALWAYS</SPRING_OUTPUT_ANSI_ENABLED>
            </environment>
            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
            <user>1000</user>
            <ports>
                <port>8080</port>
            </ports>
        </container>
        <extraDirectories>
            <paths>src/main/docker/jib</paths>
            <permissions>
                <permission>
                    <file>/entrypoint.sh</file>
                    <mode>755</mode>
                </permission>
            </permissions>
        </extraDirectories>
    </configuration>
</plugin>
问题原因与解决方案

核心原因

错误直接指向创建/app/policyrepo/.git目录失败,结合Jib配置里的<user>1000</user>,问题本质是:容器以UID 1000的非root用户运行时,没有权限在/app目录下创建新文件夹。

Jib默认会将应用文件部署到/app目录,且该目录的所有者为root。当容器切换到UID 1000用户后,自然没有写入/app目录的权限。

可行解决方案

方案1:通过Jib预先配置目录权限

  1. 在项目的src/main/docker/jib路径下创建app/policyrepo空目录
  2. 修改Jib插件的permissions配置,为目标目录设置正确的所有者和权限:
<extraDirectories>
    <paths>src/main/docker/jib</paths>
    <permissions>
        <permission>
            <file>/entrypoint.sh</file>
            <mode>755</mode>
        </permission>
        <permission>
            <directory>/app/policyrepo</directory>
            <mode>775</mode>
            <owner>1000</owner>
            <group>1000</group>
        </permission>
    </permissions>
</extraDirectories>

方案2:在启动脚本中初始化目录权限

在/entrypoint.sh的开头添加目录创建与权限修改逻辑,确保应用启动前目录已具备可写权限:

mkdir -p /app/policyrepo && chown -R 1000:1000 /app/policyrepo

方案3:更换克隆目录到容器默认可写路径

将克隆目录改为/tmp/policyrepo(容器内/tmp目录默认对所有用户开放读写权限),修改代码中的repoDir为:

File repoDir = new File("/tmp/policyrepo");

方案4:临时切换为root用户运行(仅调试用)

注释掉Jib配置里的<user>1000</user>,让容器以root用户运行,验证是否为权限问题。注意:生产环境不推荐使用root用户运行容器,存在安全风险。

内容的提问来源于stack exchange,提问作者Trần Tuấn Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:20:24