Dockerで作るGitHub環境

# やったこと
Gitで試したいことがあったので、Dockerコンテナ内にGitHubとの接続ができるGit環境を構築した。
また、コンテナを再作成しても、GitHubとの接続設定を引き継げるよう工夫したdockerfileを作成した。

---

# 作業内容
## sshキー作成用コンテナの準備
Git環境を構築するコンテナの作成前に、GitHubとの接続用sshキーを作成します。
ちょっといい方法ではないかもしれませんが、コンテナを作成しなおすたびに、GitHubへsshキーを登録しなおさなくて済むよう、sshキーを先に作成し、コンテナ作成時に追加することでキーを使いまわします。


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

```bash:ホストOS
$ docker run -itd --name make-ssh-key centos    # sshキー作成用コンテナの作成
$ docker exec -it make-ssh-key bash             # コンテナの中に入る
```

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

```bash: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へ登録します。
（[参考](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)）

そして、ホストOSへ、コンテナ内のsshキーをコピーすれば用意は終了です。
不要になったsshキー作成用コンテナは削除しておきます。

```bash:ホスト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: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キー作成用コンテナの準備)にて、`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:dockerfile
RUN chmod 600 /root/.ssh/*`
```