Bitbucket Pipeline构建含私有仓库依赖的Docker镜像失败求助
问题解决步骤
1. 修复Dockerfile中的路径错误
你遇到的exit code: 2错误直接原因是路径拼写错误:~.ssh/id_rsa应该是~/.ssh/id_rsa(缺少点号分隔符)。修改Dockerfile中的对应行:
# 错误写法 RUN echo "${SSH_PRIVATE_KEY}" > ~.ssh/id_rsa # 正确写法 RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
2. 优化SSH密钥写入与配置
为避免密钥换行符丢失、减少镜像层数,建议将SSH相关操作合并为一个RUN命令,并使用printf替代echo(echo会自动添加换行,可能破坏密钥格式):
ARG SSH_PRIVATE_KEY RUN mkdir -p ~/.ssh/ \ && printf "%s" "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa \ && chmod 600 ~/.ssh/id_rsa \ && ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts \ && eval $(ssh-agent -s) && ssh-add ~/.ssh/id_rsa
3. 验证requirements.txt私有包格式
确保requirements.txt中私有Python包的格式正确,示例格式如下:
# 格式:git+ssh://git@bitbucket.org/[团队/用户名]/[仓库名].git@[分支/标签]#egg=[包名] git+ssh://git@bitbucket.org/your-team/private-repo.git@main#egg=private-package
4. 优化Bitbucket Pipeline密钥传递
建议直接通过仓库变量传递SSH密钥,而非读取本地文件:
- 在Bitbucket仓库的「Settings > Repository variables」中添加
SSH_PRIVATE_KEY变量,值为你的私有密钥内容(确保密钥无密码)。 - 修改bitbucket-pipelines.yml中的密钥导出行:
# 替换原来的读取文件行 - export SSH_PRIVATE_KEY="$SSH_PRIVATE_KEY"
5. 可选:用BuildKit Secret替代BuildArg(更安全)
为避免密钥暴露在构建历史中,推荐使用Docker BuildKit的secret挂载方式传递SSH密钥:
- 修改Dockerfile(移除ARG SSH_PRIVATE_KEY,整合密钥配置与依赖安装):
RUN --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \ chmod 600 /root/.ssh/id_rsa \ && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \ && eval $(ssh-agent -s) && ssh-add /root/.ssh/id_rsa \ && pip install --no-cache-dir -r requirements.txt
- 修改bitbucket-pipelines.yml的build命令:
# 先将仓库变量写入临时文件,再挂载为secret - echo "$SSH_PRIVATE_KEY" > /tmp/id_rsa - docker build --secret id=ssh_key,src=/tmp/id_rsa --secret id=keys,src=$ENV_PATH -t $AWS_ECR_REPO .
内容的提问来源于stack exchange,提问作者E. Pan
相关产品推荐
相关产品推荐

