在Docker Compose容器中进行SSH代理转发

12

无法打开到您的认证代理的连接。

我正在遵循$SSH_AUTH_SOCK挂载为卷的方法,但是使用compose进行操作。

设置

~/.ssh/config

Host *
  ForwardAgent yes

Dockerfile:

FROM atlashealth/ruby:2.2.2

RUN apt-get update -qq && \
    apt-get install -qy build-essential libxml2-dev libxslt1-dev \
            g++ qt5-default libqt5webkit5-dev xvfb dbus \
            libmysqlclient-dev \
            mysql-client openssh-client git && \

    # cleanup
    apt-get clean && \
    cd /var/lib/apt/lists && rm -fr *Release* *Sources* *Packages* && \
    truncate -s 0 /var/log/*log

编写 YAML:

web:
  build: "."
  environment:
  - SSH_AUTH_SOCK=/ssh-agent
  volumes:
  - "$SSH_AUTH_SOCK:/ssh-agent"

注意: 我在compose中运行插值,因此例如$SSH_AUTH_SOCK会被替换为/private/tmp/com.apple.launchd.ZxGtZy6a9w/Listeners

我已经正确地在我的主机OSX上设置了转发,并且它可以对另一个Ubuntu主机进行工作。

运行

docker-compose run web bash

容器内

当我运行ssh-add -L时,它显示无法打开到您的身份验证代理的连接。

当我运行ssh-agent时,它返回:

SSH_AUTH_SOCK=/tmp/ssh-vqjuo7FIfVOL/agent.21; export SSH_AUTH_SOCK;
SSH_AGENT_PID=22; export SSH_AGENT_PID;
echo Agent pid 22;

当我从bash运行echo $SSH_AUTH_SOCK时,它返回/ssh-agent

问题

看起来compose使SSH_AUTH_SOCK可用于bash,但似乎ssh-agent没有获取相同的env。我错过了什么?


1
这两个链接是否有帮助:https://github.com/docker/compose/issues/551 或 https://github.com/docker/compose/pull/1633? - VonC
#1633是不必要的,我在我的“注释”中提到了我正在运行插值。感谢您指向#551,这个评论类似 - kross
对于Mac上的Docker桌面版,这个方法有效 https://dev59.com/yV8d5IYBdhLWcg3wQwS5#56404737 - millisami
2个回答

12
我使用了whilp/ssh-agent来解决这个问题,但需要注意的是,这并不直接使用SSH_AUTH_SOCK,而需要另外一个长时间运行的容器。为了方便使用,我将采用这种方法集成到docker-rails中。

  1. 启动一个长时间运行的容器:docker run -d --name=ssh-agent whilp/ssh-agent:latest

  2. 添加你的密钥:docker run --rm --volumes-from=ssh-agent -v ~/.ssh:/ssh -it whilp/ssh-agent:latest ssh-add /ssh/id_rsa

  3. 列出你的密钥:docker run --rm --volumes-from=ssh-agent -v ~/.ssh:/ssh -it whilp/ssh-agent:latest ssh-add -L

  4. 进入一个容器并使用ssh -T git@bitbucket.org检查密钥

我的yaml文件如下:

web:
    build: .
    working_dir: /project
    ports:
      - "3000"

    environment:
      # make ssh keys available via ssh forwarding (see volume entry)
      - SSH_AUTH_SOCK=/ssh-agent/socket

    volumes_from:
      # Use configured whilp/ssh-agent long running container for keys
      - ssh-agent

3
whilp/ssh-agent 发生了一些变化,因此我现在使用不同的方法,无法确定这仍然有效。如果你想要简单的解决方案,并且容器在配置有密钥的主机上运行,你可以使用卷:
  • ~/.ssh:/root/.ssh
- kross
这种方法对我仍然有效,但环境变量应该是SSH_AUTH_SOCK=/ssh/auth/sock,你还需要配置一个顶级外部卷——在这种情况下是“ssh-agent”——并将其设置为外部(volumes_from已被弃用)。在你的docker-compose中,将每个服务设置为挂载ssh-agent目录,并逐个添加你的密钥。 - Tkwon123

1
以前接受的答案使用whilp/ssh-agent对我来说由于某种原因无法工作(之前可以,但自从上次更改后就不行了,我不知道为什么),所以我创建了自己的代理容器: docker-ssh-agent 基于最小的alpine:3.4基础镜像。所以任何在OSX上仍然遇到麻烦的人,检查README,现在很容易让它运行起来!

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