将 SSH 代理与 Docker Compose 和 Dockerfile 结合使用

Abb*_*han 23 ssh node.js docker dockerfile docker-compose

我在我的一个 NestJS 应用程序中使用私有 github 存储库时遇到问题。当我使用命令创建 docker 映像时docker build,映像已成功创建,并且一切正常。但是我无法将 Dockerfile 与docker-compose.

Dockerfile这是我使用挂载功能的部分BuildKit

RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

RUN --mount=type=ssh npm install

Run Code Online (Sandbox Code Playgroud)

当单独构建图像时,Dockerfile我传递了--ssh default参数,如下所示,它成功安装了私有存储库:

docker build --ssh default -t CONTAINER_NAME .
Run Code Online (Sandbox Code Playgroud)

这篇文章之后,docker-compose.yml我在文件中包含了$SSH_AUTH_SOCK如下内容:

environment:
      - NODE_ENV:${NODE_ENV}
      - SSH_AUTH_SOCK:${SSH_AUTH_SOCK}
volumes:
      - $SSH_AUTH_SOCK:${SSH_AUTH_SOCK}
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试运行时都会出现此错误docker-compose up

#11 44.97 npm ERR! code 128
#11 44.97 npm ERR! An unknown git error occurred
#11 44.97 npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/organization/repo.git
#11 44.97 npm ERR! git@github.com: Permission denied (publickey).
#11 44.97 npm ERR! fatal: Could not read from remote repository.
#11 44.97 npm ERR! 
#11 44.97 npm ERR! Please make sure you have the correct access rights
#11 44.97 npm ERR! and the repository exists.
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

The*_*ool 35

他们已将 ssh 标志添加为 compose 中构建密钥的选项: https: //github.com/compose-spec/compose-spec/pull/234

services:
  sample:
    build:
      context: .
      ssh:
        - default
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 9

你的environment语法不正确。该environment块可以是对的列表NAME=VALUE

environment:
  - SSH_AUTH_SOCK=${SSH_AUTH_SOCK}
Run Code Online (Sandbox Code Playgroud)

或者它可以是一本字典:

environment:
  SSH_AUTH_SOCK: ${SSH_AUTH_SOCK}
Run Code Online (Sandbox Code Playgroud)

你的容器不是这些东西,所以你的容器没有SSH_AUTH_SOCK环境变量。

如果我使用这个docker-compose.yaml文件:

version: "3"

services:
  ssh:
    image: fedora:35
    environment:
      - SSH_AUTH_SOCK=${SSH_AUTH_SOCK}
    volumes:
      - ${SSH_AUTH_SOCK}:${SSH_AUTH_SOCK}
    command:
      - sh
      - -c
      - |
        yum -y install openssh-clients
        sleep inf
Run Code Online (Sandbox Code Playgroud)

我可以exec进入容器(等待包安装完成后)并验证它是否能够与我的代理通信:

$ docker-compose exec ssh ssh-add -l
2048 SHA256:... (RSA)
4096 SHA256:... (RSA)
Run Code Online (Sandbox Code Playgroud)

另外,关于您的volumes:块的一条不相关的评论:您引用变量的方式不一致。这不是问题,但它伤害了我的大脑(像这样的不一致有时会在其他情况下导致奇怪的问题)。${varname}在引用环境变量时,您最好始终使用以下语法:

volumes:
  - ${SSH_AUTH_SOCK}:${SSH_AUTH_SOCK}

Run Code Online (Sandbox Code Playgroud)