【golang】DockerでGoの開発環境を構築する
Goでボイラープレートを作っていくのですが、その際にDockerを利用して環境構築をしました。
こんな方におすすめ
- Goで開発を進めていきたいけど極力自分のPC環境を汚したくない
- go module を利用する
- 一つのアプリ開発を通して、Go以外にもnodeやRDBなどの他の技術も必要になる
前提
Dockerとdocker-composeが用意できている前提で進めていきます。
Macならターミナルで、WindowsならPowerShellで以下のコマンドを叩くと確認できます。
<!-- Macの場合 -->
$ docker --version
$ docker-compose --version
<!-- Windowsの場合 -->
$ docker version
$ docker-compose version
Docker
Dockerとは、コンテナ技術を利用して、迅速に仮想環境を構築できる
オープンプラットフォームのことです。
Docker is an open platform for developing, shipping, and running applications.
Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.
Docker streamlines the development lifecycle by allowing developers to work in standardized environments using local containers which provide your applications and services.(訳)Dockerとは、アプリケーションを開発・配置・実行するためのオープンプラットフォームです。
アプリケーションをインフラから分離できるため、ソフトウェアを迅速に提供できます。
Dockerを利用することで、開発者がアプリケーションとサービスを提供するローカルコンテナを使用して標準化された環境で作業できるようになるので、開発ライフサイクルを合理化できます。
つまり、コンテナ仮想化を用いたOSレベルの仮想化により、アプリケーションを開発・実行環境から切り離し、アプリケーションを素早く開発・提供できるということです。
コンテナ作成
まず、ディレクトリを作成します。
今回ディレクトリ名をBoilerPlateDevEnvとしました。
ボイラープレートの環境ファイルなども配置していくため、DevEnvを付けています。
$ mkdir BoilerPlateDevEnv
続いてディレクトリ構成は以下のようにします。
.
├── build
│ ├── .go_env
│ └── Dockerfile
├── boiler-plate
│ └── cmd
│ └── hello
│ └── main.go
├── docker-compose.yml
build
コンテナの作成や、Goプロジェクトの環境ファイルなどを配置するディレクトリです。
Dockerfile
DockerHubから取得するイメージや開発に合わせた基本的な設定を行います。
このDockerfileを元にイメージが作成されます。
# goバージョン
FROM golang:1.19.1-alpine
# アップデートとgitのインストール
RUN apk update && apk add git
# boiler-plateディレクトリの作成
RUN mkdir /go/src/github.com/boiler-plate
# ワーキングディレクトリの設定
WORKDIR /go/src/github.com/boiler-plate
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /go/src/github.com/boiler-plate
# パッケージのインポート
RUN go get -u golang.org/x/tools/cmd/goimports
FROMにはDocker Hubの公式イメージを指定します。
Goは2022年8月にリリースされた最新バージョンの 1.19.1[1] にします。
今回は、alpineベースのイメージを選択しました。他と比べて余計なものが入っていないため、非常に容量が小さく、軽量なイメージを構築できるからです。
Alpine Linux is much smaller than most distribution base images (~5MB), and thus leads to much slimmer images in general.
(訳)Alpine Linuxは、ほとんどのディストリビューションベースイメージ(~5MB)よりもはるかに小さいため、イメージが非常に軽量になります。
下記コマンドのapk update
で利用可能なパッケージのインデックスを最新化し、apk add
で指定したパッケージの追加をしています。 (今回はgitを追加)
# アップデートとgitのインストール
RUN apk update && apk add git
docker-compose.yml
今後RDBやnodeなどの複数のコンテナを立てることを想定し、当ファイルを作成します。
他のコンテナ同士の接続や環境などの設定ができます。
Compose is a tool for defining and running multi-container Docker applications.
Then, with a single command, you create and start all the services from your configuration.(訳)Composeは、複数コンテナのDockerアプリケーションを定義して実行するためのツールです。
そして、1つのコマンドで、構成からすべてのサービスを作成し、開始することができます。
version: '3' # composeファイルのバージョン
services:
boiler-plate: # サービス名
container_name: boiler-plate
build: # ビルドに使うDockerファイルのパス
context: .
dockerfile: ./build/Dockerfile
volumes: # マウントディレクトリ
- ./boiler-plate:/go/src/github.com/boiler-plate
tty: true # コンテナの永続化
env_file: # .envファイル
- ./build/.go_env
environment:
- TZ=Asia/Tokyo
.go_env
Goプロジェクトの環境ファイルです。
今のところは一旦、GOPATHを通しておくだけにします。
GOPATH=/go
イメージのビルド
docker-compose.ymlまで作成できたら、以下のコマンドを実行し、イメージをビルドする。
$ docker-compose build
以下のようにメッセージが表示されれば、ビルド完了です。
Successfully built b005943411b4
Successfully tagged boilerplatedevenv_boiler-plate:latest
一応以下コマンドでイメージができているか確認できます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
boilerplatedevenv_boiler-plate latest b005943411b4 4 minutes ago 368MB
main.goの作成
main.goファイルに以下を記述し、実行時に「Hello World」と表示させるようにします。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
コンテナの起動
以下コマンドを実行し、先ほど作成したイメージをもとにコンテナを起動します。
$ docker-compose up -d
一応以下のコマンドでコンテナが起動できているか確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4bb4f03cfc30 boilerplatedevenv_boiler-plate "/bin/sh" 13 minutes ago Up 13 minutes boiler-plate
動作確認
コンテナの起動が確認できたら、以下のコマンドでコンテナの中に入ります。
$ docker exec -it boiler-plate /bin/sh
そして、作成したmain.goのあるhelloファイルまで移動し、実行します。
$ cd cmd/hello
$ go run main.go
Hello World
と表示されていれば、成功です。
Hello World
-
当記事を公開した2022年9月時点 ↩︎
Discussion
RUN mkdir /go/src/github.com/boiler-plate
こちらは再帰的に作らないといけませんので
-p
オプションが必要ですね。もしくは次の
WORKDIR
コマンドがそのままない場合に作成してくれますので、コメントアウトしておくのも良いと思います。ここもこうしないと入らなかったです