ドキュメントデータを集約するためにいくつかのGitリポジトリを複製する必要があるツールがあります。このツールをDockerコンテナーに配置して、ローカルでJenkinsを使用して簡単に実行し、再現性を実現したいと考えています。
Gitリポジトリは、SSHキーによる認証を必要とするプライベートサーバーでホストされています。したがって、Dockerコンテナーは、コンテナーを実行しているユーザーのSSHキーに何らかの方法でアクセスする必要があります。
制約のリストがあります:
Dockerfile
は再現性を有効にしないと考えていますが、すでに生成されたDockerイメージはそうですroot
ユーザーとして実行したいしない-v
、-u
、…)質問:可能であれば、どうすればこれを達成できますか?
関連:
root
として実行)あなたは次のようなものを使うことができます:
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ベースのコンテナ(Alpine
やdebian
など)を不明な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で存在します/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"
を使用する
ホストマシンでリポジトリのクローンを作成し、Dockerイメージにディレクトリをマウントしても問題ありませんか?
例えば:
git clone github:repo1
git clone github:repo2
...
docker run -v repo1:/path/to/repo1 -v repo2:/path/to/repo2 ...