使用SSH代理与Docker Compose和Dockerfile

21
我在使用一个私有github repo时,在我的NestJS应用程序中遇到了问题。当我使用docker build命令创建docker镜像时,镜像成功创建并且一切正常。但是我不能使用带有docker-compose的Dockerfile。
下面是我在Dockerfile中使用BuildKit挂载特性的部分代码:
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

RUN --mount=type=ssh npm install

当仅使用 Dockerfile 构建镜像时,我传递 --ssh default 参数,如下所示,并成功安装了私有仓库:

docker build --ssh default -t CONTAINER_NAME .

参考这篇文章,在docker-compose.yml文件中,我包含了$SSH_AUTH_SOCK,如下所示:

environment:
      - NODE_ENV:${NODE_ENV}
      - SSH_AUTH_SOCK:${SSH_AUTH_SOCK}
volumes:
      - $SSH_AUTH_SOCK:${SSH_AUTH_SOCK}

无论如何,每次我尝试运行 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.

有什么想法我做错了什么吗?
3个回答

30

8
您的环境变量语法有误。 环境变量块可以是名称 = 值对的列表:
environment:
  - SSH_AUTH_SOCK=${SSH_AUTH_SOCK}

或者它可以是一个字典:

environment:
  SSH_AUTH_SOCK: ${SSH_AUTH_SOCK}

你的情况不属于这两种情况,因此你的容器没有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

等待软件包安装完成后,我可以通过exec进入容器,并验证它能否与我的代理通信:

$ docker-compose exec ssh ssh-add -l
2048 SHA256:... (RSA)
4096 SHA256:... (RSA)

此外,有一个与您的“卷”块无关的评论:您在引用变量时不太一致。这不是问题,但它会让人感到困惑(而且这样的不一致有时会导致其他情况下出现奇怪的问题)。因此,最好始终使用${varname}语法来引用环境变量。
volumes:
  - ${SSH_AUTH_SOCK}:${SSH_AUTH_SOCK}


1
它没有工作。你如何运行Docker构建命令? - vladimir.gorea
在这个例子中不需要使用“docker build”命令,它使用一个现有的镜像。 - larsks
1
@cyril 只需执行 docker-compose up - larsks

0
我想给出一个更完整的答案,涵盖了该过程中涉及的不同组件,还包括一个 GitHub Actions 工作流程,以防有人需要。
我还在 GitHub 上创建了一个 gist,用于 Python,我将在这里对其进行适应。
Docker Compose(docker-compose.yaml):
版本:'3.2'
服务: my-app: 平台:linux/amd64 构建: ssh: - default=${SSH_AUTH_SOCK} 命令:my-command.sh
Dockerfile(仅相关部分):
# 将GitHub的SSH主机密钥添加到已知主机并安装依赖项 RUN --mount=type=ssh mkdir -p -m 0600 ~/.ssh && \ ssh-keyscan github.com >> ~/.ssh/known_hosts && \ npm install
GitHub工作流程:
名称:构建My-App 触发: 推送: 分支: - "*"
任务: 构建测试: 运行在:ubuntu-latest 环境: SSH_AUTH_SOCK: $SSH_AUTH_SOCK 步骤: - 名称:检出代码 使用:actions/checkout@v3
- 名称:设置SSH密钥 运行: mkdir -p ~/.ssh ssh-agent -a ${SSH_AUTH_SOCK} > /dev/null ssh-add - <<< "${{ secrets.SSH_PRIVATE_KEY }}" - 名称:构建Docker镜像 运行:docker compose build my-app

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接