web-dev-qa-db-ja.com

DockerコンテナーからGitリポジトリを複製する方法

ドキュメントデータを集約するためにいくつかのGitリポジトリを複製する必要があるツールがあります。このツールをDockerコンテナーに配置して、ローカルでJenkinsを使用して簡単に実行し、再現性を実現したいと考えています。

Gitリポジトリは、SSHキーによる認証を必要とするプライベートサーバーでホストされています。したがって、Dockerコンテナーは、コンテナーを実行しているユーザーのSSHキーに何らかの方法でアクセスする必要があります。

制約のリストがあります:

  1. dockerイメージにSSHキーを埋め込みたいではない
  2. ユーザーがDockerイメージをビルドすることをしない必要があります。 Dockerfileは再現性を有効にしないと考えていますが、すでに生成されたDockerイメージはそうです
  3. コンテナをrootユーザーとして実行したいしない
  4. コンテナを実行しているホストユーザーのSSHキーを使用するwant
  5. コンテナーを開始するコマンドにパラメーターを提供できます(-v-u、…)

質問:可能であれば、どうすればこれを達成できますか?

関連:

9
Jim

あなたは次のようなものを使うことができます:

echo "git-user:x:$(id -u):$(id -g):Git User:/tmp:/bin/bash" > /tmp/fake_passwd # See below why to use this
docker run \
   -u $(id -u):$(id -g) \
   -w /tmp \
   -v $HOME/.ssh:/path/to/.ssh \
   -v /tmp/fake_passwd:/etc/passwd  \
   --entrypoint sh \
   -it \
   Alpine/git

  # commands in the container:
  $ export GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa -o "StrictHostKeyChecking=no"'
  $ git clone [path to git repo]

これにより、コンテナーはホストユーザーと同じUID/GIDで実行されるため、権限を変更したり、ルート権限を使用したりせずにキーを読み取ることができます。詳細に:

  • -u $(id -u):$(id -g)コンテナユーザーをホストユーザーと一致するように設定します
  • -w /tmp書き込み可能なディレクトリで作業するようにします(読み取り/書き込み権限があるボリュームをマウントするか、そのようなディレクトリでイメージをビルドすることもできます)
  • -v $HOME/.ssh:/path/to/.sshは、ホストからローカルユーザーのSSHキーをマウントします
  • --entrypoint sh-itは、インタラクティブなシェルセッションを使用するAlpine/gitに固有です。イメージでは必要ない場合があります。

なぜ偽の/etc/passwdファイルをマウントするのですか?

Linuxベースのコンテナ(Alpinedebianなど)を不明なUID/GID(/etc/passwdに存在しないもの)で実行すると、git cloneコマンドがエラーメッセージを表示する場合があるといった:

Cloning into 'myrepo'...
No user exists for uid 1000
fatal: Could not read from remote repository.

この「偽の」passwdファイルをマウントすることで、OSがコンテナーを実行しているユーザーを認識し、git cloneコマンドが機能するようになります。パスワードファイルは次のようになります。

git-user:x:1000:1000:Git User:/tmp:/bin/bash

これはおおよその意味です:

  • git-userはUID 1000およびGID 1000で存在します
  • hOMEディレクトリは/tmpです(これはオプションですが、このディレクトリは書き込み可能であり、git cloneからの警告を避けます)

/tmp(またはイメージのビルド中に作成される可能性のある別のディレクトリ)を設定することにより、git-userの書き込み可能なHOMEディレクトリが確保され、git clone.sshディレクトリを作成できなかったという警告が表示されなくなります。

ただし、コンテナーで別のタスクを実行する場合は、他の副作用が生じる可能性があります。

GIT_SSH_COMMANDを使用する理由

GIT_SSH_COMMAND='ssh -i /path/to/.ssh/id_rsa'git cloneがキーを使用していることを確認しますが、これはssh-agentを使用して行うこともできます-参照 https://serverfault.com/questions/447028/non-interactive-git-clone-ssh-fingerprint-プロンプト

例では-o "StrictHostKeyChecking=no"を使用していますが、安全でない可能性があります、別の解決策は、git repoサーバーのホストキーを使用して既知のホストファイルをコンテナにマウントすることです。 -o "UserKnownHostsFile=/path/to/KnownHostFile"を使用する

15
Pierre B.

ホストマシンでリポジトリのクローンを作成し、Dockerイメージにディレクトリをマウントしても問題ありませんか?

例えば:

git clone github:repo1
git clone github:repo2
  ...

docker run -v repo1:/path/to/repo1 -v repo2:/path/to/repo2 ...
2
LeGEC