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

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

ただいまの
回答率

88.23%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,044

matto

score 11

私は現在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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • nobonobo

    2020/12/17 15:25

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

    キャンセル

  • matto

    2020/12/17 16:52

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

    キャンセル

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

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る