手元の環境を汚さずに環境を構築していろいろ試したいです。
Dokcerを使えばできるんだろうとは思っていましたが、実際に行うと色々わからない事が多々ありました。
何とかやりたい事ができたので、私の行った方法を紹介します。
やりたい事
- Goを使ってRESTサーバを構築する。(echoを使う)
- 手元の環境を汚さない(デプロイを意識して)Dockerを使って構築する。
- SQLはPostgreSQLを使う(Goからのアクセスはgoreを使う)
- Goのコードはホットリロードできるようにする
構築方法
Goを動作させるアプリケーションサーバと、SQL(PostgreSQL)のサーバとDockerのコンテナを2つ使います。
ファイル構成
以下のファイル構成で作成しました。
├── README.md ├── docker │ └── app │ └── Dockerfile アプリケーションサーバのDokcerfile ├── docker-compose.yml ├── go.mod ├── go.sum └── main.go アプリケーションサーバのコード |
Goを動作させるコンテナの定義はDockerfileに定義しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | FROM golang:1.14.11-alpine3.12 WORKDIR /go/src/app ENV GO111MODULE=on RUN apk add --no-cache \ alpine-sdk \ git # ホットリロード用 RUN go get github.com/pilu/fresh # Goのライブラリを追加する RUN go get github.com/lib/pq RUN go get github.com/go-gorp/gorp RUN go get github.com/labstack/echo EXPOSE 8080 CMD ["fresh"] |
Goを動作させるのに必要なライブラリをインストールしています。
DBにはgorpを使ってアクセスし、ドライバーはpqを使います。
docker-compose.ymlは以下のように定義しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | version: '3' services: app: build: docker/app volumes: - ./:/go/src/app ports: - "8080:8080" tty: true environment: links: - db:database db: image: postgres:10.1 ports: - "5432:5432" environment: - "POSTGRES_USER=user1" - "POSTGRES_PASSWORD=password" - "POSTGRES_DB=testdb" |
docker-composeは全く詳しくはないので、いろいろな情報を調べて作成しました。
ポイントは、appサーバの定義にlinksと定義がある点です。
linksと定義しておくと、他のコンテナにアクセスできるようになります。
DSNでlinksで定義した情報を使ってアクセスするようにenvironmentに記述しています。
(これが分からなくてGoのコンテナからSQLサーバにアクセスできなくてハマりました)
go.modを作成するためにgo mod init
を実行する必要があるのですが、GOROOTの下にプロジェクトを作成していない場合は適当なパッケージのパスを渡す必要があります。
$ got mod init github.com /k28/hogehoge |
これも知らないとハマるので注意です。
ソースコード
- Githubで公開しています。
0 件のコメント :
コメントを投稿