私は現在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:
※追記
以下のようなディレクトリ構成です。
├── DB
├── client
├── server
├── nginx
└── docker-compose.yml
それぞれにDockerイメージを立てて環境を構築しています。
現在の開発だと、
goのイメージに当たるDockerfileです。
# TODO マルチステージビルド(timezone) wait-for-it up時のコンテナ停止を防ぐ(DBの接続制御)
FROM golang:1.15-alpine
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
WORKDIR /usr/src/app/server
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN apk add --no-cache ca-certificates && \
apk --update add tzdata && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
apk del tzdata && \
rm -rf /var/cache/apk/*
RUN go build -o main ./cmd/index-indicator-apis/main.go
CMD ["/usr/src/app/server/./main"]
EXPOSE 8080
※こちらはまだ未完成であり、最終的には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共に学習歴の浅い私ではそれなりに導入コストがかかると感じた為より導入しやすく現場で使われている可能性が高いものを選びたいと思い質問させて頂きました!
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
nobonobo
2020/12/17 15:25
ベストプラクティスは対象によって変化するので主に開発する対象というかカテゴリを絞ってもらえると何らかの回答が得られるかもしれません。
matto
2020/12/17 16:52
今回もコメント頂き誠にありがとうございます。
> 主に開発する対象
もう少し詳しく記載させて頂きます!