質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

0回答

2550閲覧

Golang vscode Docker の開発環境のベストプラクティス

Shika_Tech

総合スコア13

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/12/17 00:26

編集2020/12/17 08:22

私は現在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共に学習歴の浅い私ではそれなりに導入コストがかかると感じた為より導入しやすく現場で使われている可能性が高いものを選びたいと思い質問させて頂きました!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobonobo

2020/12/17 06:25

ベストプラクティスは対象によって変化するので主に開発する対象というかカテゴリを絞ってもらえると何らかの回答が得られるかもしれません。
Shika_Tech

2020/12/17 07:52

今回もコメント頂き誠にありがとうございます。 > 主に開発する対象 もう少し詳しく記載させて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問