Golangでバックエンド開発する用のDockerfile

1701 ワード

File構成(参考程度に)

メモ用、できるだけ簡潔かつ快適にするためのDockerfile

FROM golang:1.16.3-alpine
# 軽量
RUN apk add --update &&  apk add git
# git
ADD ./app /go/src/app
# ソースコードのコピー
WORKDIR /go/src/app
# 作業ディレクトリの指定
ENV GO111MODULE=on
# go.mod使うことを明示
RUN go get -u github.com/cosmtrek/air
# airの導入(後述)
RUN go mod download
# go.modの中身をダウンロード
EXPOSE 8000
# ポート
CMD ["air"]

続いて使う用のdocker-compose.yml。部分的だと想像がつきにくいので全て載せておく。
基本的に普通の分離構造ならフロント-バックエンド-データベースみたいな構成にしがちだと思う(フロントの言語でバックエンドもやるならその限りではない)。

version: '3'
services:
  db:
    image: postgres:latest
    container_name: "db"
    restart: always
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: admin
    ports:
      - '9000:9000'
  server:
    build: ./server
    container_name: "server"
    ports:
      - '8000:8000'
    depends_on:
      - db
    volumes:
      - ./server/app/:/go/src/app
  front:
    build: ./front
    container_name: "front"
    ports:
      - '3000:3000'
    volumes:
      - ./front/app/:/usr/src/app
    command: /bin/sh -c 'npm install && npm run dev'

airの導入(ホットリロード)

これはかなり開発速度に影響が出るので入れておきたい。最初にDockerfileとかだけ作っておいて

docker exec server go mod init <hoge>
docker exec server go get -u github.com/cosmtrek/air
docker exec server air

とかで試せる。しかしながらこれは本番環境で使うpackageではないのでDockerfileに滑り込ませる。

volumesによる同期

これもやっておかないと致命的、自分は最初このvolumesの意味が分かってなかったので職場で「なんでこれdocker上と同期してるんだ...?」ってなっていた。