在Docker构建过程中,PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码

2022-02-28 00:00:00 python pip docker ssh bitbucket

问题描述

我正在尝试在docker build命令期间通过pip安装(通过conda env create命令)来自BitBucket的自定义python包,而不输入SSH密码/密码。此问题与this other question类似,但不同,因为错误发生在docker build命令期间。

conda env create命令的环境.yml文件(在docker build期间)如下所示:

name: my_app
channels:
  - defaults
dependencies:
  - pip=21.2.2
  - python=3.8.11
  - pip:
    - git+ssh://git@bitbucket.org/my_org/my_package_repo.git
    - pandas==1.2.5
    - python-dotenv==0.19.0
    - xlrd==2.0.1
prefix: /usr/local/anaconda3/envs/my_app

docker build尝试在Docker映像内构建conda环境时,我收到此错误:

Installing pip dependencies: ...working... Pip subprocess error:
  Running command git clone -q 'ssh://****@bitbucket.org/my_org/my_package_repo.git' /tmp/pip-req-build-3t5mkmnw
  Host key verification failed.
  fatal: Could not read from remote repository.

  Please make sure you have the correct access rights
  and the repository exists.
WARNING: Discarding git+ssh://****@bitbucket.org/my_org/my_package_repo.git. Command errored out with exit status 128: git clone -q 'ssh://****@bitbucket.org/my_org/my_package_repo.git' /tmp/pip-req-build-3t5mkmnw Check the logs for full command output.
ERROR: Command errored out with exit status 128: git clone -q 'ssh://****@bitbucket.org/my_org/my_package_repo.git' /tmp/pip-req-build-3t5mkmnw Check the logs for full command output.

Ran pip subprocess with arguments:
['/opt/conda/envs/work_content/bin/python', '-m', 'pip', 'install', '-U', '-r', '/tmp/condaenv.9p_rq9_h.requirements.txt']
Pip subprocess output:
Collecting git+ssh://****@bitbucket.org/my_org/my_package_repo.git (from -r /tmp/condaenv.9p_rq9_h.requirements.txt (line 3))
  Cloning ssh://****@bitbucket.org/my_org/my_package_repo.git to ./pip-req-build-3t5mkmnw

failed

CondaEnvException: Pip failed

当我在我的终端中并按照referenced StackOverflow question中的答案操作时,此远程/自定义软件包安装成功。但是,当我在运行docker build命令之前尝试执行相同的操作时,收到上面的错误。我猜想这是因为Docker正在构建一个全新的操作系统映像,并且它不再具有我在终端中提供的SSH RSA密码短语。如何在生成期间不提供密码短语的情况下通过此错误?

更新

根据其中一个当前答案中的建议,我已将我的Dockerfile修改为如下所示:

# syntax=docker/dockerfile:experimental
FROM continuumio/miniconda3:4.10.3
...
RUN apt-get install -y openssh-client git
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts
RUN --mount=type=ssh git clone git@bitbucket.org:my_org/my_package_repo.git /tmp/my_package_repo
--mount命令在/tmp目录中创建存储库的本地副本。因此,现在需要将Conda Environmental ment.yml文件从本地目录更改为pip install,如下所示:

name: my_app
channels:
  - defaults
dependencies:
  - pip=21.2.2
  - python=3.8.11
  - pip:
    - /tmp/my_package_repo
    - pandas==1.2.5
    - python-dotenv==0.19.0
    - xlrd==2.0.1
prefix: /usr/local/anaconda3/envs/my_app

..。我正在使用如下命令运行docker build进程:

eval $(ssh-agent); ssh-add ~/.ssh/id_rsa
DOCKER_BUILDKIT=1 docker build --ssh default .
上面的eval命令用于在Docker构建开始之前手动输入我的SSH密码。docker build命令前面的DOCKER_BUILDKIT=1强制Docker使用Docker Buildkit构建,这是Dockerfile中的RUN --mount=type=ssh git clone命令所必需的。这个解决方案现在对我有效。这并不完全是下面答案中的内容,所以我想我应该与社区分享一下。我会将指向此方向的答案标记为正确答案。

ssh

推荐答案需要访问您的私钥以进行身份验证。您的私钥不会与运行在Docker镜像中的任何命令共享。 Docker内置了解决此问题的功能,文档here。

基本上您要做的是将PUBLIC密钥下载到Docker镜像:

# Download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

定义类型为ssh的装载,以便Docker Engine转发SSH代理连接。

RUN --mount=type=ssh git clone git@github.com:myorg/myproject.git myproject

此运行命令可以是其他命令,例如安装PyThin包的命令。

您可以使用-ssh选项:

构建停靠机映像
docker build --ssh default .

相关文章