web-dev-qa-db-ja.com

ローカルマシンのSSHキーをDockerコンテナーに渡す方法は?

私はDockerfileからDockerイメージを構築しようとしていますが、実行する必要がある手順の1つは、プライベートGitlabリポジトリ経由でのみ利用できる依存関係をインストールすることです。つまり、コンテナはクローンを作成するためにSSHキーにアクセスできる必要があります。これが最も安全な方法ではないことは知っていますが、これは中間コンテナーになり、アプリの実行に必要なすべてのコンポーネントが配置されたときに削除されます。

問題は、私が何をしようとも、接続を確立するためにDocker内にsshエージェントを取得できないことです。私は得ます:

npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

npm installを実行せずにリポジトリを複製しようとすると、同じことが起こります。ここに私が使用するDockerfileがあります:

FROM risingstack/Alpine:3.4-v6.9.4-4.2.0


RUN apk update

RUN apk add openssh

ARG SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 700 /root/.ssh && \
    ssh-keyscan github.com > /root/.ssh/known_hosts

# Add the keys and set permissions
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod 700 /root/.ssh/id_rsa && \


RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa && ssh -o StrictHostKeyChecking=no [email protected] || true && npm install

そしてコマンド(私はビルド引数として秘密鍵を渡します):

docker build -t test  --build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" .
4

docker buildを実行する前に、すでに実行しているssh-agentを使用して、ホスト上でクローンを作成します。

本当に秘密鍵を画像に含める必要がある場合(これは危険であることが確認されています)、それをデフォルトの場所$HOME/.ssh/id_rsaに置くことができるはずです。 ssh-agentを起動しようとしないでください。問題が積極的なホストキーチェックである場合は$HOME/.ssh/configファイルを挿入することも、ホストキーがすでに含まれている$HOME/.ssh/known_hostsファイルを挿入することもできます。これらはすべてfilesであるため、Dockerビルドツリーにそれらを入れ、COPY$HOME/.sshに入れる方が簡単な場合があります。

1
David Maze

これは私にとってはうまくいきます:

この回避策の使用: https://stackoverflow.com/a/47544999/3957754 ビルド引数としてファイルを渡す

Dockerfile

ARG SSH_KEY
ENV SSH_KEY=$SSH_KEY

# Make ssh dir
RUN mkdir /root/.ssh/

# Create id_rsa from string arg, and set permissions

RUN echo "$SSH_KEY" > /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts

# Add git providers to known_hosts
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN ssh-keyscan gitlab.com >> /root/.ssh/known_hosts

ビルド

docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .

これにより、ビルド段階または実行段階でENTRYPOINT ["docker-entrypoint.sh"]を使用してgit clone [email protected] ...(gitlab、またはbitbucket)を実行できます。

5
JRichardsz