在 Docker 构建期间,无需输入 SSH 密码即可使用 SSH 从 BitBucket 安装自定义包

pip install custom package from BitBucket with SSH without entering SSH password during Docker build

我正在尝试在 docker build 命令期间从 BitBucket pip 安装(通过 conda env create 命令)自定义 python 包,而不输入 SSH password/passphrase。这个问题类似于 ,但不同之处在于错误发生在 docker build 命令期间。

conda env create 命令的 environment.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

当我在我的终端中并按照 中的答案操作时,这个 remote/custom 包安装成功。但是,当我在 运行 和 docker build 命令之前尝试做同样的事情时,我得到了上面的错误。我假设这是因为 Docker 正在构建一个全新的 OS 图像,并且它不再具有我在终端中提供的 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 environment.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 构建,这是 Docker 文件中 RUN --mount=type=ssh git clone 命令所必需的.这个解决方案现在对我有用。这不完全是下面的答案,所以我想我会与社区分享这个。我会将指向我这个方向的答案标记为正确答案。

SSH 需要访问您的 RSA 私钥以进行身份​​验证。您的私钥不会与 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 引擎转发 SSH 代理连接。

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

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

您使用 -ssh 选项构建 docker 图像:

docker build --ssh default .