Git
Docker
dockerfile

Dockerで作るGitHub環境

More than 1 year has passed since last update.


やったこと

Gitで試したいことがあったので、Dockerコンテナ内にGitHubとの接続ができるGit環境を構築した。

また、コンテナを再作成しても、GitHubとの接続設定を引き継げるよう工夫したdockerfileを作成した。



作業内容


sshキー作成用コンテナの準備

Git環境を構築するコンテナの作成前に、GitHubとの接続用sshキーを作成します。

ちょっといい方法ではないかもしれませんが、コンテナを作成しなおすたびに、GitHubへsshキーを登録しなおさなくて済むよう、sshキーを先に作成し、コンテナ作成時に追加することでキーを使いまわします。

まず、ホストOSにてsshキー作成用コンテナを作成し、中に入ります。


ホストOS

$ docker run -itd --name make-ssh-key centos    # sshキー作成用コンテナの作成

$ docker exec -it make-ssh-key bash # コンテナの中に入る

次に、sshキー作成用コンテナ内でsshキーを作成し、コンテナを抜け出します。


sshキー作成用コンテナ

$ yum -y update

$ yum -y install git
$ cd /root
$ ssh-keygen -t rsa # sshキーの作成 何もなければ3回Enterを押して完了
$ ssh -T git@github.com # 接続確認 yesを入力
$ ls -a /root/.ssh/ # ファイルが存在することを確認
. .. id_rsa id_rsa.pub known_hosts
$ cat /root/.ssh/id_rsa.pub # 表示されるキーをコピーしてGitHubに登録
$ exit # コンテナを抜ける

cat /root/.ssh/id_rsa.pubで表示されるキーをGitHubへ登録します。

参考

そして、ホストOSへ、コンテナ内のsshキーをコピーすれば用意は終了です。

不要になったsshキー作成用コンテナは削除しておきます。


ホストOS

$ docker cp make-ssh-key:/root/.ssh .ssh    # コンテナからホストへコピー

$ ls -a # コピーできたか確認
./ ../ .ssh/
$ docker rm -f make-ssh-key # sshキー作成用コンテナの削除
make-ssh-key
$ docker ps -a | grep make-ssh-key # 削除できていることを確認


dockerfileの準備

以下のdockerfileを用意します。


dockerfile

FROM centos

RUN yum update -y
RUN yum install -y git

# sshキーの追加
ADD .ssh /root/.ssh
RUN chmod 600 /root/.ssh/*

WORKDIR /usr/local # プロジェクトをクローンするパスを指定
RUN git clone git@github.com:${ユーザ名}/${プロジェクト}



コンテナイメージの作成

dockerfileが準備できたら、dockerfileと同じ階層に先ほど取得した.sshディレクトリを設置して、Dockerイメージを作成します。

$ ls -a                         # Dockerfileと.sshディレクトリを配置

./ ../ .ssh/ Dockerfile
$ docker build -t git-test . # Dockerファイルからイメージ作成


コンテナの作成

ここまで用意できれば、あとは以下のコマンドで、Git環境が整ったコンテナを何度も作成することができます。

$ docker run -it --name git-test-container git-test


メモ


known_hostsファイルについて

sshキー作成用コンテナの準備にて、ssh -T git@github.comを実行するのは、接続テストのためだけではありません。

sshでは、一度接続したサーバの情報が~/.ssh/known_hostsに記録されます。

sshの初期設定では、このファイルに記録されていないサーバへ最初に接続しようとしたタイミングで、接続の許可を求めてきます。

今回のように、git cloneをコンテナイメージ構築時に行う場合、gitへの接続をしようとしたときに接続許可を求められると構築が失敗してしまいます。

そのため、すでに接続情報が記録されているknown_hostsファイルを取得するために、一度ssh -T git@github.comコマンドにてGitHubへの接続を行います。


.sshディレクトリのパーミッション

.sshディレクトリ配下のファイルパーミッションを変更しない場合、ssh接続時に以下のようなエラーが出てきます。

# ssh -T git@github.com

The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:
RSA key fingerprint is MD5:
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/root/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/root/.ssh/id_rsa": bad permissions
Permission denied (publickey).

そのため、dockerfileでは、.sshディレクトリのパーミッションを以下のコマンドで変更しています。


dockerfile

RUN chmod 600 /root/.ssh/*`