Dockerコンテナ内開発でgitを使用する方法

こんにちは!
seiです!

 

Dokcerコンテナを仮想環境としてチーム開発するときにgitが使えなくて、てこずったので備忘録です!

環境

ホストマシン: WSL:Ubuntu 20.04.2 LTS
VSCodeの拡張機能「dev container」を用いて開発
コンテナの起動はdocker-compose.yamlファイルから

 

コンテナにgitをインストールする

Dockerfile

from python3.8

RUN apt-get update && apt-get install -y git

ENTRYPOINT ["/bin/bash"]

 

コンテナ内にapt install でgitをインストールしましょう。
また、コンテナ内でシェルが開けるようにENTRYPOINTを設定しています。

 

docker-compose.yamlファイル

version: '2'
services:
  api:
    build: . //このディレクトリ内にあるdockerファイルを用いる
    ports:
      - "8000:8000"
    volumes:
      - ./:/var/www/

    tty: true
    stdin_open: true

コンテナ内でbashシェルを用いて対話的に操作したいのでtty:trueとstdin_open:trueを設定します。

コンテナに入ってバックエンドサーバを立ち上げたかったのでこのようにしています。

 

githubに接続する設定を行う

 

githubからpushしたり、pullしたりする場合はsshの秘密鍵が必要です。

しかし、以下のようにしても秘密鍵はCOPYされません。

COPY .ssh var/www/.ssh
# .ssh
- .ssh
   - id_rsa.pem
   - known_hosts


# /var/www/.ssh
- .ssh
    - known_hosts   //  id_rsa.pemはコピーされない!

これは秘密鍵が含まれたイメージを誤って配布しないための仕様です。
もし、秘密鍵が含まれたdockerイメージをdocker_hubなどに公開してしまったら…

業務でやらかしたと思うと震えが止まりません(笑)

 

bind mountを使おう!
なので、bind mountを使ってssh秘密鍵をコンテナ内にもっていきましょう。
/home/user/.sshにある秘密鍵をコピーしてきます。
僕のプロジェクトの構成は以下のような感じでした。

/project-root
│
├── .devcontainer
│   ├── devcontainer.json
│
├── docker-compose.yaml
├── Dockerfile
│
├── .ssh
│   ├── id_rsa.pem
│   ├── config
│
└── app
    ├── APIサーバのディレクトリ達

使用する秘密鍵を指定する

git pushやgit pullでgithubと通信するときに使用される秘密鍵は、デフォルトでは.sshフォルダの中を見に行きます。
コンテナ内だとrootユーザでログインするので、以下のフォルダの秘密鍵を使用します。
/root/.ssh/id_rsa

先ほどのプロジェクトルートにある
.sshフォルダの中にconfigファイルを作って使用する秘密鍵を指定してあげます。

.ssh/config

Host github.com
        HostName github.com
        IdentyFile /var/www/.ssh/id_rsa
これをコンテナ作成時にコンテナ内の/root/.ssh/configにCOPYするために、Dockerファイルを修正します。
from python3.8 

RUN apt-get update && apt-get install -y git

// 設定ファイルをコピーする
COPY ./ssh/conig /root/.ssh/config 

ENTRYPOINT ["/bin/bash"]
DockerファイルでCOPYできるのはDockerファイルがあるディレクトリ以下なので、気を付けてください。相対パスで上の階層を通ることはできません。

 

お疲れ様でした!これでコンテナ内でgitが使えるはずです!

コンテナ内でもgitを使えるようにするだけで結構大変でした。僕は秘密鍵がコピーできないことを知らなかったので、そこではまってしまいました。

今までのプロジェクトでは、dockerコンテナを仮想マシンとして使っているケースはまだまだ少ないように感じます。
チームメンバーが全員VScodeを使っているのであれば、コンテナを仮想マシンとして使用することで拡張機能までそろえることができるのでとても便利です。

virtual box等に比べてもOSはホストマシン側にあるDokcerのほうがメモリ使用量も少なく、軽いのでとても使いやすいです。

もっとdockerコンテナでの開発が進めば良いなと思っています。

プログラミング学習方法を発信してます!