【问题标题】:Using SSH agent with Docker Compose and Dockerfile将 SSH 代理与 Docker Compose 和 Dockerfile 一起使用
【发布时间】:2022-08-15 04:29:14
【问题描述】:

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

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

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 .

this article 之后,在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.

知道我做错了什么吗?

    标签: node.js docker ssh docker-compose dockerfile


    【解决方案1】:

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

    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)
    

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

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

    【讨论】:

    • 它不工作。你如何运行 docker build 命令?
    • 此示例中不需要“docker build”命令;它使用现有图像。
    【解决方案2】:

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

    services:
      sample:
        build:
          context: .
          ssh:
            - default
    

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2021-08-19
      相关资源
      最近更新 更多