私は現在Goを学習中でdocker-composeで GoとMysqlのコンテナを作成しました。
無事にコンテナを起動することはできたのですが、docker vscode golang
などで調べると
- golang のライブラリ Air や realizeを用いたホットリロードで開発する方法、
- vscodeのremote containerという拡張機能を使う方法、
- docker-composeのvolumeでローカルのソースコードをマウントして、変更する度に
docker-compose up
を叩く方法(現在はこれで開発中 ※しかしパッケージのインストールはコンテナをビルドし直さないといけない)
- etc
様々な方法がヒットしますが、
実際の現場ではどのように開発を行なっているのでしょうか。
Docker、Golangともに業務未経験の為、アドバイスいただければ幸いです。
こちらdocker-compose.ymlになります。
version: "3" services: react: build: context: ./client dockerfile: Dockerfile container_name: react_container tty: true volumes: - ./client:/usr/src/app/client command: bash -c "cd /usr/src/app/client && yarn start" ports: - "3000:3000" go: build: context: ./server dockerfile: Dockerfile container_name: go_container tty: true volumes: - "./server:/usr/src/app/server" command: go run cmd/index-indicator-apis/main.go ports: - "8080:8080" depends_on: - "db" environment: MYSQL_HOST: mysql_container nginx: image: nginx container_name: nginx_container ports: - "80:80" environment: - TZ=Asia/Tokyo volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf db: image: mysql:8.0 container_name: mysql_container volumes: - db-store:/var/lib/mysql - ./DB/logs:/var/log/mysql - ./DB/mysql/my.cnf:/etc/mysql/conf.d/my.cnf environment: - MYSQL_DATABASE=index_indicator_apis - MYSQL_USER=user - MYSQL_PASSWORD=pass - MYSQL_ROOT_PASSWORD=pass - TZ=Asia/Tokyo ports: - "3306:3306" volumes: db-store:
※追記
以下のようなディレクトリ構成です。
tree
1├── DB 2├── client 3├── server 4├── nginx 5└── docker-compose.yml
それぞれにDockerイメージを立てて環境を構築しています。
現在の開発だと、
goのイメージに当たるDockerfileです。
server/Dockerfile
1# TODO マルチステージビルド(timezone) wait-for-it up時のコンテナ停止を防ぐ(DBの接続制御) 2FROM golang:1.15-alpine 3 4ENV CGO_ENABLED=0 5ENV GOOS=linux 6ENV GOARCH=amd64 7 8WORKDIR /usr/src/app/server 9 10COPY go.mod go.sum ./ 11RUN go mod download 12COPY . . 13 14RUN apk add --no-cache ca-certificates && \ 15 apk --update add tzdata && \ 16 cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ 17 apk del tzdata && \ 18 rm -rf /var/cache/apk/* 19 20RUN go build -o main ./cmd/index-indicator-apis/main.go 21 22CMD ["/usr/src/app/server/./main"] 23 24EXPOSE 8080 25
※こちらはまだ未完成であり、最終的にはalpineでマルチビルドをしたいと思っております。
現状のイメージでは./mainコマンドでバイナリファイルを実行しているので、goのソースコードを変える度に毎回コンテナを再生成しなければならないという認識です。
そこでとりあえず前述したdocker-compose.ymlを以下のようにしました。
services: go: //中略 volumes: - "./server:/usr/src/app/server" command: go run cmd/index-indicator-apis/main.go //中略
これによりdocker-compose upを叩けばソースコードが反映されるという認識です。
ですが検索すると
AirやRealizeのホットリロードライブラリにより、ローカルのvscodeでソースコードの変更を保存するだけでgoがbuildされるというような記事を見つけましたが、docker,go共に学習歴の浅い私ではそれなりに導入コストがかかると感じた為より導入しやすく現場で使われている可能性が高いものを選びたいと思い質問させて頂きました!
あなたの回答
tips
プレビュー