web-dev-qa-db-ja.com

Dockerビルド中のSSHエージェント転送

Dockerfileを使用してdockerイメージを構築しているときに、githubリポジトリのクローンを作成する必要があります。公開ssh鍵をgitハブアカウントに追加しました。Dockerホストからリポジトリを複製できます。 Dockerの実行時に_$SSH_AUTH_SOCK_環境変数をdocker run --rm -it --name container_name \ -v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \ -e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_imageのようにマッピングすることで、Docker Hostのsshキーを使用できることがわかります。

ドッカーのビルド中にどうすれば同じことができますか?

15
Anand

Docker 18.09以降の場合

Dockerの新機能を使用して、既存のSSHエージェント接続またはキーをビルダーに転送できます。これにより、たとえば、ビルド中にプライベートリポジトリのクローンを作成できます。

手順:

まず、新しいBuildKitを使用するように環境変数を設定します

export DOCKER_BUILDKIT=1

次に、新しい(実験的)構文でDockerfileを作成します。

# syntax=docker/dockerfile:experimental

FROM Alpine

# install ssh client and git
RUN apk add --no-cache openssh-client git

# download public key for github.com
RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# clone our private repository
RUN --mount=type=ssh git clone [email protected]:myorg/myproject.git myproject

そして、イメージを構築します

docker build --ssh default .

詳細はこちら: https://medium.com/@tonistiigi/build-secrets-and-ssh-forwarding-in-docker-18-09-ae8161d066

15
jozo

残念ながら、現在Dockerではビルド時のボリュームマウントがサポートされていないため、sshソケットをビルドコンテナーに転送できません。

これはかなり長い間議論のトピックでした、参照のためにGitHubの以下の問題を参照してください:

ご覧のとおり、この機能はさまざまなユースケースで複数回リクエストされています。これまでのところ、メンテナーはビルド中にボリュームをマウントすると移植性が損なわれると感じているため、この問題への対処をためらっていました。

ビルドの結果は、基になるホストから独立している必要があります

this の説明で概説されています。

5
nardeas

これは、別のビルドスクリプトを使用して解決できます。たとえば、bashスクリプトを作成して、それを~/usr/local/bin/docker-composeまたはお好きな場所に配置します。

#!/bin/bash

trap 'kill $(jobs -p)' EXIT
socat TCP-LISTEN:56789,reuseaddr,fork UNIX-CLIENT:${SSH_AUTH_SOCK} &

/usr/bin/docker-compose $@

次に、Dockerfileで既存のsshソケットを使用します。

...
ENV SSH_AUTH_SOCK /tmp/auth.sock
...
  && apk add --no-cache socat openssh \
  && /bin/sh -c "socat -v UNIX-LISTEN:${SSH_AUTH_SOCK},unlink-early,mode=777,fork TCP:172.22.1.11:56789 &> /dev/null &" \
  && bundle install \
...
or any other ssh commands will works

これで、カスタムdocker-compose buildを呼び出すことができます。共有sshソケットを使用して実際のdockerスクリプトを呼び出します。

3
Samoilenko Yuri

これも興味深いです:

それは次のようになります:

  • ホスト上
mkfifo myfifo
nc -lk 12345 <myfifo | nc -U $SSH_AUTH_SOCK >myfifo
  • Dockerfile内
RUN mkfifo myfifo
RUN while true; do \
  nc 172.17.0.1 12345 <myfifo | nc -Ul /tmp/ssh-agent.sock >myfifo \
done &

RUN export SSH_AUTH_SOCK=/tmp/ssh-agent.sock

RUN ssh ...
0
Dan Pav