最初に結論
これをクローンしてコンテナの中に入ればおk
DooDとは
Docker outsite of Dockerの略です。Docker内部のコンテナからホストのDockerを操作する方法です。DinD(Docker in Docker)という方針もありますが今回はこちらで。
どうしてそんなことを?
インターンで働いている企業の開発環境がMacです。Docker関連にMakeファイルが用意されており、Dockerコマンド、Goコマンド、Unix系コマンドが必要になったためです。
できるだけローカルの環境を汚さずに開発をしたかったため、Docker上に環境を置きたいと思ったのですが、環境構築の時点でGoのコマンドを使用しているため本来であればローカルにGoをインストールする必要がありました。
DooDを採用することで、ローカルのように扱えるGoのコンテナ、実際に運用しているコンテナの2つによって、擬似的に同じ環境を作ります。
ディレクトリ構成
.
|-- .devcontainer
| |-- devcontainer.json
| `-- docker-compose.yml
|-- Dockerfile
|-- docker-compose.yaml
|-- go.mod
|-- main.go
`-- pkgs
`-- pkg1.go
こんな感じになります。最小限のGoプログラムは書きたいと思ったので適当な構造を作りました。
内容解説
FROM golang:1.19
#Debianが指定される
WORKDIR /go/src/work
RUN go install -v golang.org/x/tools/gopls@latest
RUN go install -v github.com/ramya-rao-a/go-outline@latest
RUN go install -v github.com/go-delve/delve/cmd/dlv@latest
RUN go install -v honnef.co/go/tools/cmd/staticcheck@latest
#Go周辺の便利機能インストール
RUN apt update
RUN apt install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
#Dockerインストール準備
#Dockerドキュメント https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/debian/
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
RUN echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt update
RUN apt install docker-ce docker-ce-cli containerd.io -y
#本体インストール
RUN curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
RUN chmod +x /usr/local/bin/docker-compose
#docker-composeのインストール、実行権限付与
Dockerfileでは公式イメージにDockerCLIをインストールしています。結構手順が多くハマったこともありましたがこれで落ち着きました。
version: '3'
services:
go_host:
build: .
container_name: "go_host"
tty: true
stdin_open: true
command: /bin/bash
#ホストのディレクトリをコンテナにマウント
volumes:
- .:/go/src/app
- /var/run/docker.sock:/var/run/docker.sock
# - ./env/.ssh:/root/.ssh
# ssh でgitなどをしたい場合設定を置くと良い
/var/run/docker.sock:/var/run/docker.sock
の部分でWSLに存在するDockerに。コンテナがアクセスできるようにしています。これによりDooDを実現しています。sshでgitなどもしたいのでssh用の設定もおいておくと良いです。また、composeのcommandにlocalでgit configを設定しておくとコンテナの中でだけ決まったアカウントを使える、みたいな環境になってくれてとても良いです。
結論
業務で使える環境が用意できた。この記事がWindowsプログラマーの助けになれば幸いです。