[Go] Dockerを使ってGoでRESTサーバを作成する

手元の環境を汚さずに環境を構築していろいろ試したいです。 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 件のコメント :

コメントを投稿