web-dev-qa-db-ja.com

dockerfileを使用したプライバシーGitリポジトリのクローン作成

私はこのコードをいろいろな作業用dockerfilesの周りからコピーしました、これが私のものです:

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git python-virtualenv

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

# Copy over private key, and set permissions
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN chown -R root:root /root/.ssh

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

# Remove Host checking
RUN echo "Host bitbucket.org\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

# Clone the conf files into the docker container
RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf

これは私にエラーを与えます

Step 10 : RUN git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf
 ---> Running in 0d244d812a54
Cloning into '/home/docker-conf'...
Warning: Permanently added 'bitbucket.org,131.103.20.167' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
2014/04/30 16:07:28 The command [/bin/sh -c git clone [email protected]:Pumalo/docker-conf.git /home/docker-conf] returned a non-zero code: 128

これがdockerfilesを使うのは私にとっては初めてですが、私が読んだことから(そして実際の設定から取られて)私はこれがうまくいかないのか分からない。

私のid_rsaは私のdockerfileと同じフォルダにあり、このリポジトリを問題なく複製できる私のローカルキーのコピーです。

編集する

私のdockerfileで私は追加することができます:

RUN cat /root/.ssh/id_rsa

そしてそれは正しいキーを出力するので、私はそのキーが正しくコピーされたことを知っています。

私はまたノアが忠告し、走ったようにしてみました:

RUN echo "Host bitbucket.org\n\tIdentityFile /root/.ssh/id_rsa\n\tStrictHostKeyChecking no" >> /etc/ssh/ssh_config

これも残念ながらうまくいきません。

211
crooksey

私のキーはパスワードで保護されていたため、問題が発生していました。作業ファイルを以下に示します(将来のGoogle社員のため)

FROM ubuntu

MAINTAINER Luke Crooks "[email protected]"

# Update aptitude with new repo
RUN apt-get update

# Install software 
RUN apt-get install -y git
# Make ssh dir
RUN mkdir /root/.ssh/

# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
ADD id_rsa /root/.ssh/id_rsa

# Create known_hosts
RUN touch /root/.ssh/known_hosts
# Add bitbuckets key
RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN git clone [email protected]:User/repo.git
273
crooksey

そのDockerイメージ用に新しいSSH鍵セットを作成する必要があります。おそらく自分の秘密鍵をそこに埋め込むことを望まないからです。うまく機能させるには、そのキーをgitリポジトリのデプロイキーに追加する必要があります。これが完全なレシピです。

  1. あなたのrepo-keyとrepo-key.pubファイルを与えるssh-keygen -q -t rsa -N '' -f repo-keyでsshキーを生成してください。

  2. リポジトリ展開キーにrepo-key.pubを追加します。
    GitHubで、[あなたのリポジトリ] - > [設定] - > [キーのデプロイ]に移動します。

  3. Dockerfileに次のようなものを追加してください。

     ADD repo-key/
    RUN\
     chmod 600/repo-key &&\
     echo "IdentityFile/repo-key" >>/etc/ssh/ssh_config &&\
     echo -e "StrictHostKeyChecking no" >>/etc/ssh/ssh_config &&\
     //ここにあなたのgit cloneコマンド... 
    

上記はStrictHostKeyCheckingをオフにするので、.ssh/known_hostsは必要ありません。私はおそらく上記の答えのうちの1つでssh-keyscanを使った解決策がもっと好きです。

85
Marcin R

Sshの設定をいじる必要はありません。環境変数を含む設定ファイル(Dockerファイルではありません)を使用し、実行時にShellスクリプトにDockerファイルを更新させます。あなたはあなたのDockerfilesからトークンを守り、あなたはhttpsを介してクローンを作ることができます(sshキーを生成したり渡したりする必要はありません)。

設定>パーソナルアクセストークン に移動します。

  • repoスコープを有効にしてパーソナルアクセストークンを生成します。
  • このようにクローンを作成します。git clone https://[email protected]/user-or-org/repo

あなたが共有Dockerfileを使用する場合、これはあなたのプロジェクトの他の人々にあなたのアクセスキーを公開するかもしれないとコメントしている人もいます。これはあなたの特定のユースケースには関係ないかもしれませんし、そうでないかもしれませんが、ここであなたがそれに対処することができるいくつかの方法があります:

  • シェルスクリプトを使用して、キーを変数として含むことができる引数を受け入れます。 Dockerfile内の変数をsedなどに置き換えます。つまり、スクリプトをsh rundocker.sh MYTOKEN=fooに置き換えてhttps://{{MY_TOKEN}}@github.com/user-or-org/repoに置き換えます。環境変数を使って同じことをするために設定ファイル(.ymlや好きなフォーマット)を使うこともできます。
  • そのプロジェクト専用のgithubユーザーを作成します(そしてそのためのアクセストークンを生成します)。
62
Calvin Froedge

もう1つの選択肢は、SSHキーが最終イメージに含まれていないことを確認するためにマルチステージドッカービルドを使用することです。

My 投稿 で説明されているように、git cloneに必要な依存関係を持った中間イメージを準備してから、必要なファイルを最終イメージにCOPYすることができます。

さらに、もし私たちが中間層をLABELしていれば、終了時にそれらをマシンから削除することさえ可能です。

# Choose and name our temporary image.
FROM Alpine as intermediate
# Add metadata identifying these images as our build containers (this will be useful later!)
LABEL stage=intermediate

# Take an SSH key as a build argument.
ARG SSH_KEY

# Install dependencies required to git clone.
RUN apk update && \
    apk add --update git && \
    apk add --update openssh

# 1. Create the SSH directory.
# 2. Populate the private key file.
# 3. Set the required permissions.
# 4. Add github to our list of known hosts for ssh.
RUN mkdir -p /root/.ssh/ && \
    echo "$SSH_KEY" > /root/.ssh/id_rsa && \
    chmod -R 600 /root/.ssh/ && \
    ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Clone a repository (my website in this case)
RUN git clone [email protected]:janakerman/janakerman.git

# Choose the base image for our final image
FROM Alpine

# Copy across the files from our `intermediate` container
RUN mkdir files
COPY --from=intermediate /janakerman/README.md /files/README.md

それから私達は造ることができる:

MY_KEY=$(cat ~/.ssh/id_rsa)
docker build --build-arg SSH_KEY="$MY_KEY" --tag clone-example .

SSHキーがなくなったことを証明します。

docker run -ti --rm clone-example cat /root/.ssh/id_rsa

ビルドマシンから中間イメージを消去します。

docker rmi -f $(docker images -q --filter label=stage=intermediate)
16
jaker

Bitbucketリポジトリの場合は、リポジトリとプロジェクトへの読み取りアクセス権を持つApp Password(Bitbucket設定 - > Access Management - > App Password、画像を参照)を生成します。

bitbucket user menu

それならあなたが使うべきコマンドは次の通りです。

git clone https://username:[email protected]/reponame/projectname.git
16
Nomce

上記の解決策はbitbucketではうまくいきませんでした。私はこれがトリックであると考えました:

RUN ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \
    && eval `ssh-agent` \
    && ssh-add ~/.ssh/[key] \
    && git clone [email protected]:[team]/[repo].git
1
tvgriek

あなたはしばしばdocker buildの中からプライベートリポジトリのgit cloneを実行したくないでしょう。クローンを作成するには、プライベートssh認証情報をイメージ内に配置して、後でそのイメージへのアクセス権を持つユーザーが抽出できるようにします。

代わりに、一般的な方法は、選択したCIツールでdockerの外側からgitリポジトリを複製し、単にファイルをCOPYname__でイメージに複製することです。これには2つ目の利点があります。dockerキャッシングです。 Dockerキャッシングは、実行されているコマンド、それに含まれる環境変数、入力ファイルなどを調べ、それらが同じ親ステップからの以前のビルドと同じ場合は、その以前のキャッシュを再利用します。 git cloneコマンドでは、コマンド自体は同一なので、たとえ外部のgitリポジトリが変更されたとしても、dockerはキャッシュを再利用します。ただし、COPYname__コマンドはビルドコンテキスト内のファイルを調べて、それらが同一であるか更新されているかを確認し、適切な場合にのみキャッシュを使用します。


自分のビルドに資格情報を追加する予定がある場合は、マルチステージビルドでそれを行うことを検討し、タグ付けされてビルドホストの外部にプッシュされることのない初期段階にこれらの資格情報を配置します。結果は次のようになります。

FROM ubuntu as clone

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa

# Clone the conf files into the docker container
RUN git clone [email protected]:User/repo.git

FROM ubuntu as release
LABEL maintainer="Luke Crooks <[email protected]>"

COPY --from=clone /repo /repo
...

最近では、BuildKitは、イメージに書き込まれないマウントとしてsshキーを渡すことを可能にするいくつかの実験的な機能をテストしています。

# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <[email protected]>"

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git

# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
    git clone [email protected]:User/repo.git

そして、あなたはそれを構築することができます:

$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
  --secret id=ssh_id,src=$(pwd)/id_rsa .

これにはまだあなたのsshキーがパスワードで保護されていないことが必要ですが、少なくとも一段階でビルドを実行し、COPYコマンドを削除し、sshクレデンシャルがイメージの一部にならないようにすることができます。


BuildKitは、あなたがまだあなたのパスワードで保護されたsshキーを持つことを可能にするsshのための機能も追加しました、結果は以下のようになります:

# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <[email protected]>"

# Update aptitude with new repo
RUN apt-get update \
 && apt-get install -y git

# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
 && touch /root/.ssh/known_hosts \
 && ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts

# Clone the conf files into the docker container
RUN --mount=type=ssh \
    git clone [email protected]:User/repo.git

そして、あなたはそれを構築することができます:

$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
  --ssh default=$SSH_AUTH_SOCK .

繰り返しになりますが、これはイメージレイヤに書き込まれることなくビルドに挿入されるため、資格情報が誤って漏洩する可能性があります。


前の行がキャッシュされている場合でもdockerにgit cloneを強制的に実行させるには、ビルドごとに変わるビルドARGを挿入してキャッシュを壊すことができます。それはこんな感じです:

# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone [email protected]:User/repo.git

次に、docker buildコマンドでその変更引数を挿入します。

date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .
0
BMitch