手元の環境を汚さずに環境を構築していろいろ試したいです。
Dokcerを使えばできるんだろうとは思っていましたが、実際に行うと色々わからない事が多々ありました。
何とかやりたい事ができたので、私の行った方法を紹介します。
## やりたい事
- Goを使ってRESTサーバを構築する。(echoを使う)
- 手元の環境を汚さない(デプロイを意識して)Dockerを使って構築する。
- SQLはPostgreSQLを使う(Goからのアクセスはgoreを使う)
- Goのコードはホットリロードできるようにする
## 構築方法
Goを動作させるアプリケーションサーバと、SQL(PostgreSQL)のサーバとDockerのコンテナを2つ使います。
### ファイル構成
以下のファイル構成で作成しました。
```text
`gutter:false;
├── README.md
├── docker
│ └── app
│ └── Dockerfile アプリケーションサーバのDokcerfile
├── docker-compose.yml
├── go.mod
├── go.sum
└── main.go アプリケーションサーバのコード
```
Goを動作させるコンテナの定義はDockerfileに定義しました。
```text
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は以下のように定義しました。
```text
version: '3'
services:
app:
build: docker/app
volumes:
- ./:/go/src/app
ports:
- "8080:8080"
tty: true
environment:
- "DSN=postgres://user1:password@database:5432/testdb?sslmode=disable"
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の下にプロジェクトを作成していない場合は適当なパッケージのパスを渡す必要があります。
```bash
`gutter:false;
$ got mod init github.com/k28/hogehoge
```
これも知らないとハマるので注意です。
## ソースコード
- [Github](https://github.com/k28/go-ORM-Sample)で公開しています。
## 参考URL
- [Dockerコンテナ上でPythonプログラムからPostgreSQLに接続する](https://qiita.com/sey323/items/a4875408a67cea6a8c52)
- [dockerでPostgreSQLのコンテナ作成と初期化](https://qiita.com/asylum/items/17e655d8369c19affbc3)
- [DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)
- [Go v1.11 + Docker + fresh でホットリロード開発環境を作って愉快なGo言語生活](https://qiita.com/po3rin/items/9acd41ef428436335c97)
- [Dockerfileを極めて、Dockerマスターになろう!](https://qiita.com/soushiy/items/0945bcbc7ecce4822985)
0 件のコメント :
コメントを投稿