向Docker alpine/git提供Git凭证失败,请求技术协助
解决Docker多阶段构建中Git私有仓库克隆凭证问题
问题根源
你在docker-compose里配置的volumes是容器运行时的挂载规则,Docker镜像的构建阶段(docker build过程)完全无法访问这些挂载的文件,所以第一阶段执行git clone时,根本读不到主机的Git凭证文件,导致报错。
另外你的Dockerfile还有两个小问题:
RUN cd joke-generator这条命令不会改变后续命令的工作目录,因为每个RUN都是独立的shell进程- 第二阶段
COPY后,需要确保工作目录切换到正确的项目路径
解决方案
方案1:用SSH密钥构建(推荐,更安全)
通过SSH密钥克隆私有仓库,避免明文凭证传递,步骤如下:
- 生成SSH密钥对(如果没有),将公钥添加到GitHub仓库的部署密钥列表中
- 修改Dockerfile第一阶段:
FROM alpine/git:2.36.3 as repository WORKDIR /code # 构建时传入SSH私钥,配置SSH环境 ARG SSH_PRIVATE_KEY RUN mkdir -p /root/.ssh/ && \ echo "$SSH_PRIVATE_KEY" > /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa && \ # 信任GitHub主机密钥 ssh-keyscan github.com >> /root/.ssh/known_hosts # 使用SSH地址克隆私有仓库 RUN git clone git@github.com:private-company/joke.git FROM openjdk:19-jdk-alpine3.16 WORKDIR /code COPY --from=repository /code/joke/ /code # 切换到项目目录并执行构建 WORKDIR /code/joke-generator RUN mvn clean install -DskipTests CMD ["./generate-joke.sh"]
- 修改docker-compose.yml,添加构建参数传递:
joke-generator: build: context: ./ dockerfile: Dockerfile.joke-gen args: SSH_PRIVATE_KEY: ${SSH_PRIVATE_KEY} volumes: - ${HOME}/.config:/etc/.config:ro - ${HOME}/.gitconfig:/etc/.gitconfig:ro
- 构建前在终端导出SSH私钥:
export SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" docker-compose build
方案2:构建阶段挂载主机凭证(不推荐,安全性低)
如果一定要使用主机的Git凭证文件,可以通过docker build的mounts参数在构建阶段挂载文件,修改docker-compose.yml的build配置:
joke-generator: build: context: ./ dockerfile: Dockerfile.joke-gen mounts: - type: bind source: ${HOME}/.config/git/credentials target: /etc/.config/git/credentials read_only: true - type: bind source: ${HOME}/.gitconfig target: /etc/.gitconfig read_only: true volumes: - ${HOME}/.config:/etc/.config:ro - ${HOME}/.gitconfig:/etc/.gitconfig:ro
同时调整Dockerfile第一阶段的Git配置:
FROM alpine/git:2.36.3 as repository WORKDIR /code RUN git config --global credential.helper 'store --file /etc/.config/git/credentials' RUN git config --global http.sslVerify false RUN git clone https://github.com/private-company/joke.git
修复Dockerfile的路径问题
将RUN cd joke-generator替换为WORKDIR /code/joke-generator,或者用RUN cd joke-generator && mvn clean install -DskipTests,确保目录切换在同一个shell进程中生效。
总结
优先选择SSH密钥的方式,既安全又能彻底解决构建阶段无法访问运行时挂载文件的问题。记住Docker的构建阶段和运行阶段是完全独立的,不要混淆两者的配置规则。
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

