私は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)" .
docker build
を実行する前に、すでに実行しているssh-agentを使用して、ホスト上でクローンを作成します。
本当に秘密鍵を画像に含める必要がある場合(これは危険であることが確認されています)、それをデフォルトの場所$HOME/.ssh/id_rsa
に置くことができるはずです。 ssh-agentを起動しようとしないでください。問題が積極的なホストキーチェックである場合は$HOME/.ssh/config
ファイルを挿入することも、ホストキーがすでに含まれている$HOME/.ssh/known_hosts
ファイルを挿入することもできます。これらはすべてfilesであるため、Dockerビルドツリーにそれらを入れ、COPY
を$HOME/.ssh
に入れる方が簡単な場合があります。
これは私にとってはうまくいきます:
この回避策の使用: 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)を実行できます。