【问题标题】:How to deploy code from Github using deploy key in Docker?如何使用 Docker 中的部署密钥从 Github 部署代码?
【发布时间】:2018-04-24 15:56:47
【问题描述】:

我想在构建时将代码从 Github 提取到我的 Docker 映像中。我有一个从存储库生成的部署密钥,但在我看来 ssh-agent 不适用于我的 Docker 映像。

我做了什么(我的 Dockerfile):

FROM python:2.7-stretch
ADD ./id_rsa /root/.ssh/id_rsa
RUN eval "$(ssh-agent -s)"
RUN ssh-add -K /root/.ssh/id_rsa

输出:

Step 12/22 : RUN eval "$(ssh-agent -s)"
 ---> Running in f9ad80981cee
Agent pid 6
Removing intermediate container f9ad80981cee
 ---> d773f7ce5917
Step 13/22 : RUN ssh-add -K /root/.ssh/id_rsa
 ---> Running in 95efeed6a7ad
Could not open a connection to your authentication agent.
The command '/bin/sh -c ssh-add -K /root/.ssh/id_rsa' returned a non-zero code: 2

如您所见,ssh-agent 已启动,但未在其中添加密钥。

如果我跳过 ssh-add 步骤,那么我的 git pull 稍后会因为特权而失败,因为没有发生身份验证,这正如预期的那样失败。

【问题讨论】:

    标签: git docker ssh-agent


    【解决方案1】:

    实际上,您不需要将私钥复制到容器中(最好不要这样做)。

    您只需要在主机和 docker 容器上安装并启动 ssh-agent,然后您需要做的就是挂载 ssh-aget 的套接字文件:

    如果您使用的是 docker-compose

    environment:
      - "SSH_AUTH_SOCK=/tmp/ssh-agent"
    volumes:
      - $SSH_AUTH_SOCK:/tmp/ssh-agent
    

    使用 docker

    docker run -v $SSH_AUTH_SOCK:/tmp/ssh-agent 8be57bbc9561 sleep 1000000 # 8be57bbc9561 is an id of the image
    docker exec -it -e SSH_AUTH_SOCK=/tmp/ssh-agent 5b6f4a8f8661 /bin/ash # 5b6f4a8f8661 is an id of the container
    

    附言

    就你的情况而言,我认为问题可能与export 命令有关,该命令通常是ssh-agent 输出代码中的evaled

    它应该为您提供两个变量:SSH_AUTH_SOCKSSH_AGENT_PID。但export 不会跨图像持续存在。

    您已经使用了两次RUN:第一次用于启动ssh-agent 并导出变量,然后用于添加密钥。并且每个 Dockerfile 指令都会生成一个中间容器(并且导出不会在它们之间持续存在)。

    如果您仍想以这种方式使用它(我强烈建议避免使用它),您可以尝试在单个 RUN 中绑定两个命令:

    RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
    

    我根据上面的回答写了short post

    【讨论】:

    • 好的,我明白了,所以为了避免放置密钥,我确实打算稍后使用 docker compose,因为我有多个服务,我刚刚开始。所以说到重点,我尝试了 docker build 。 -v $SSH_AUTH_SOCK:/tmp/ssh-agent -e SSH_AUTH_SOCK=/tmp/ssh-agent.它导致:未知的速记标志:'v' in -v 请参阅'docker build --help'。您能否指出有关如何按照您建议的方式进行操作的适当文档?非常感谢所有帮助:) 是否可以使用 docker build 测试 docker 文件,然后再编写 docker compose?
    • @HarshM -v-e 标志与docker run 命令一起使用,而不是与docker build 一起使用,因为安装的卷和环境变量与容器的运行时有关,而不是与映像本身有关.
    • 是的,这是可能的,实际上它也可以。 Docker compose 经常使用下面的 Dockerfile 来构建和启动你的服务。它只是帮助您在格式良好的配置文件中定义这些标志并定义一些相关的服务。
    • 我知道了,但是我采纳了您的建议,现在使用 CodeBuild 作为构建工具。并且不使用 ssh 来获取 docker 映像中的代码。谢谢。
    • 我不明白。对于“docker run”,您需要映像,但在构建阶段使用 ssh。我如何在 build 映像时挂载 ssh-aget 的套接字文件?
    【解决方案2】:

    来自link

    -K 选项是 Apple 的标准版本的 ssh-add,它存储 当您将 ssh 密钥添加到 ssh 代理。

    如果您没有安装 Apple 的标准版本,您可能会收到 一个错误。

    尝试删除 -K 选项并重新构建它。以下对我有用:

    FROM python:2.7-stretch
    ADD ./id_rsa /root/.ssh/id_rsa
    RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa
    

    【讨论】:

      【解决方案3】:

      编辑~/.ssh/config

      用你的新密钥添加

      Host github.com
      IdentityFile /root/.ssh/id_rsa
      

      【讨论】:

      • 这意味着使用不受密码保护的密钥。
      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2012-05-14
      • 2021-04-29
      • 1970-01-01
      • 2021-04-26
      相关资源
      最近更新 更多