Go
GitHub
golang
Docker
Tech DoDay 23

Go Webサーバコンテナ化 : ローカル変更の自動ビルド&コンテナ、GitHubプライベートリポジトリのデプロイコンテナ

開発用、デプロイ用のDockerfile作成や、GitHubプライベートリポジトリのgo get、clone方法などをまとめます。

デプロイ用コンテナは、どこで実行するのかとか、CI/CDのパイプラインで使うのかとか、用途がぼやっとしたまま作ったので、流用してどんどん変えていく必要があるかもしれません。


想定するディレクトリ構成

プロジェクトのルートから、だいたいこんな感じ。

スクリーンショット 2018-10-21 16.52.17.png


ローカル用コンテナ

ローカルのコードを実行するDockerfileとdocker-compose.ymlの作成。下記の構成で、コードの変更が監視され、自動でビルドされるので、コードを編集するたびに、手動でビルドと実行をする必要がなくなる。


手順


  1. ローカルのコードを実行するDockerfileを作成する。


    1. Go 1.11で追加されたモジュールシステムを前提とする。

    2. freshによるコードのライブローディングを使用する。



  2. Dockerfileを実行するdocker-compose.ymlを作成する。

  3. docker-compose.ymlからコンテナ起動するとWebサーバにアクセスできる。


Dockerfile


Dockerfile

FROM golang:1.11.1


# プロジェクト用ディレクトリを設定
WORKDIR /go/src/app
# カレントをディレクトリに追加し、ローカルのコードを保存
COPY . .
# Go 1.11で追加されたモジュール機能を使用する
ENV GO111MODULE=on

# コードの変更をライブローディングして実行するため、freshを使用する
RUN go get github.com/pilu/fresh
# freshを実行
CMD ["fresh"]


docker-compose.yml

ポートやdockerfileの場所など、プロジェクトに合わせて設定する。


docker-compose.yml

version: '3'

services:
app:
# Dockerfileから、更に親のディレクトリを参照するためにcontextとdockerfile項目を併用する
build:
# docker-compose.ymlから見た、プロジェクトのルートディレクトリへの相対パス
context: ../../
# contextで設定したディレクトリから見た、実行対象のDockerfileへの相対パス
dockerfile: ./cmd/local-machine/Dockerfile
# ローカルの変更を読み込むためにマウントする
volumes:
- ../../:/go/src/app
# 公開ポート
ports:
- "8080:8080"


デプロイ用コンテナ

他のマシンで実行することを前提とするが、プロダクトでは非公開リポジトリの運用が主となるため、ここではGitHubのプライベートリポジトリを対象とした内容とする。


手順


  1. GitHubのプライベートリポジトリをgo getできるように、GitHub上でトークンを発行する。

  2. リポジトリからgo getして実行するDockerfileを作成する。

  3. 引数にトークンを指定する、docker buildコマンドを作成する。


    1. 変数名はdeploytokenとする。



  4. Dockerfileをビルドして、実行するとWebサーバにアクセスできる。


GitHubアクセストークンの作成


  1. GitHubにログインし、Settings → Developer settings → Personal access tokensへ、ページ移動する。

  2. Generate new token ボタンをクリックする。

  3. 必要項目入力。


    1. Token description に用途を入力。

    2. Select scopes の repo をすべてチェックする。



スクリーンショット 2018-10-21 16.38.50.png

トークンが表示されるので、メモする。再表示はできないので、紛失したら再発行となる。

スクリーンショット 2018-10-21 16.41.38.png


Dockerfile


Dockerfile

FROM golang:1.11.1


# GitHubのアクセストークンをビルド時の引数から取得
ARG deploytoken

# 作業ディレクトリを設定
WORKDIR /go/bin

# GitHubのプライベートリポジトリをgo getするためにトークンを設定
RUN git config --global url."https://${deploytoken}:x-oauth-basic@github.com/".insteadOf "https://github.com/"

# デプロイ対象のリポジトリをgo get
RUN go get github.com/<GitHubユーザ名>/<GitHubリポジトリ名>/...

# ポート開放
EXPOSE 8080

# コンテナ起動時にリポジトリからgo getしたアプリケーションを実行
ENTRYPOINT /go/bin/<GitHubリポジトリ名>


docker buildコマンド

docker build --build-arg deploytoken=<GitHubで作成したトークン> -t go-develop-making ./

GoLandの場合は下記の操作で設定。


  1. Dockerfileを右クリック。

  2. Create 'Dockerfile' ... をクリック。

  3. Build args:項目に、deploytoken=<トークン文字列>を指定する。

スクリーンショット 2018-10-21 16.44.50.png

スクリーンショット 2018-10-21 16.46.00.png


まとめ

ローカル用のコンテナは手動コンテナビルド→自動アプリビルド→自動アプリ実行、とし、デプロイ用のコンテナは自動コンテナビルド→実行するホストに委ねる、とすることができました。