Docker + Revel + MySQLの環境構築からプロジェクト新規作成までコマンド1つで実行できるようにしてみた。

Docker + Revel + MySQLの環境構築からプロジェクト新規作成までコマンド1つで実行できるようにしてみた。

先月、弊社の勉強会にてGo言語フレームワークであるRevelを使ったWebアプリの発表を行ってきました。
Go言語未経験だったのですが、Revelを通して色々やってみたら思ってた数倍楽しかったので、その過程を記事にしていこうと思います。

まずは最初に行ったDockerでのRevelの環境構築について紹介します。

[docker-compose up –build] のコマンド1つでプロジェクトを新規作成するようにしていますので、初学者の方でも簡単に環境構築できます。

こちらのGitHubにあげていますので、ぜひこちらもご覧ください。
https://github.com/teru2teru0/go-revel-blog

フォルダ構成と、コマンド実行後のファイル構成


用意するフォルダ構成はこのようにします。

./
├── docker/
│   ├── go/
│   │   ├── Dockerfile
│   │   └── init.sh
│   └── mysql/
│       ├── Dockerfile
│       ├── env
│       └── my.cnf
└── docker-compose.yml


今後アプリ内でDBを使用することも考慮し、MySQLのコンテナも一緒に立てておきます。

コマンド実行後のフォルダ構成

docker-compose up –build コマンドを実行した後は、このようなフォルダ構成になります。

./
├── README.md
├── docker/
│   ├── go/
│   │   ├── Dockerfile
│   │   └── init.sh
│   └── mysql/
│       ├── Dockerfile
│       ├── env
│       └── my.cnf
├── docker-compose.yml
├── myapp # 新規作成される/
│   └── ...略
│   
└── mysql_data # 新規作成される/
    └── mysql/
        └── ...略

準備

ではそれぞれのファイルを用意していきます。

docker-compose.yml

まずはdocker-compose.ymlファイルを用意します。

注意点ですが、利用端末がM1 Macの場合は mysql にあるplatform部分のコメントを外してください
こちらがコメントアウトの状態だと、ビルド時にエラーが起こります。

version: '3'

services:
  app:
    build:
      context: ./docker/go
      dockerfile: Dockerfile
    tty: true # Docker Composeを使用して、コンテナを起動させた際にコンテナが終了してしまうのを防ぐ
    volumes: # パスをボリュームとしてマウントする
      - ".:/var/www/revel"
    ports: # ポートを公開する。ホストとポートを指定
      - 9000:9000
    links:
      - mysql

  mysql:
    build:
      context: ./docker/mysql
      dockerfile: Dockerfile
    restart: always
    # platform: linux/x86_64 # M1 macの場合は、この設定を追加する
    hostname: mysql
    env_file:
      - ./docker/mysql/env
    ports:
      - 3306:3306
    volumes:
      - "./mysql_data/mysql:/var/lib/mysql"

その他に設定を加えたい方は、Docker compose公式ドキュメント などを参考にしてください。

docker/go

docker/goフォルダには2ファイル用意します。
DockerFile」と「init.sh」ファイルです。

DockerFile

FROM golang:latest

WORKDIR /var/www/revel

RUN go install github.com/revel/cmd/revel@latest

EXPOSE 9000

COPY init.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/init.sh
CMD ["init.sh"]

こちらのDockerFile内では以下のようなことを行っています。

パターン
1. Go言語のベースイメージを取得
2. ワークディレクトリを設定
3. Revelコマンド(最新)をインストール
4. ポートを9000番に設定
5. 初期実行コマンド(init.sh)をコピーして実行コマンドに設定

他に設定したい部分があったらご自由にカスタムしてください。

init.sh

#!/bin/bash

# アプリ名として採用する変数をセット、今回はmyappにする
app_name="myapp"

cd /var/www/revel

# Revelアプリ作成、該当フォルダが存在しない時に [revel new -a {app}] を実行してアプリ作成
if [ ! -d "./${app_name}" ]; then
    revel new -a ${app_name}
fi

# 起動
revel run -a ${app_name}


DockerFileに記載されている CMD [“init.sh”] の部分を記載することで、docker-compose upコマンド実行時に init.shの処理を行なってくれます。

init.shでは、まずフォルダ直下に移動し、もしrevelのプロジェクトフォルダがない場合は作成してから revel run -a {app_name} でrevelを実行しています。

docker/mysql

docker/mysqlフォルダには3ファイル用意します。
DockerFile」と「env」と「my.cnf」ファイルです。

DockerFile

FROM mysql:8.0
COPY my.cnf /etc/mysql/conf.d/

imageを選択して、設定ファイルをコピーしています。

わざわざDockerFileに分けていますが、もしファイル数を減らしたい方はdocker-compose.ymlファイルにimageとvolumeを記載するのもいいかもしれませんね。

env

TZ=Asia/Tokyo
MYSQL_DATABASE=app_database
MYSQL_USER=user
MYSQL_PASSWORD=yourStrong(!)Password
MYSQL_ALLOW_EMPTY_PASSWORD=yes
MYSQL_ROOT_PASSWORD=yourStrong(!)Password

DBの設定を行っています。

DB名、ユーザー名、パスワードはそのままでも使用できますが、セキュリティのため各自で設定をお願いします。

my.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='Asia/Tokyo'
innodb_use_native_aio=0

[client]
default-character-set=utf8mb4

こちらも特にコピペで大丈夫です。(私自身もよく理解できていません笑)

これで全てのファイルの準備が完了しました。

docker-composeコマンド実行

さて、ここまで準備が整いましたら、コマンドを実行してイメージ構築 & コンテナを開始しましょう。

docker-compose.ymlファイルがあるディレクトリにて、下記のdocker-composeコマンドを実行してください。

docker-compose up --build


実行すると ターミナルにはこのような画面が出力されると思います。
ERRORの文字が1ヶ所出てますが問題ないです。


黄色文字でMySQLのログがたくさん流れますが、上記のようにINFO の文字が出れば実行できます。

http://localhost:9000 にアクセスし、下記の画像のような「It works!」という画面が出れば完了です。


初回アクセス時はこの画面が表示されない事が多い(少なくとも自分の環境は2回読み込みが必要でした)ので、再読み込み等を行なって2回以上アクセスしてみてください。

コンテナ内に入る場合

もし立ち上げたコンテナ内に入りたい場合は、下記コマンドを実行して入ることができます。

# app
docker-compose exec -it app bash


# mysql
docker-compose exec -it mysql bash

# mysqlの中にログインする場合
mysql -u user --password='yourStrong(!)Password'

これで環境構築は完了しました!
Dockerを使用すると簡単に構築できますね。重かったり作法が違くて混乱しますけど笑

冒頭でもご紹介しましたが、コードはこちらのGitHubにあげていますので、ぜひご覧ください。
https://github.com/teru2teru0/go-revel-blog

まとめ

今回はDockerでRevel + MySQLの環境構築 + アプリ作成まで行いました。

コマンドを複数打つのが億劫なタイプなので、コンテナ起動して中に入ってインストールして…ということをせずに一発でできるように色々と試行錯誤しました。もう少しスマートな方法があるのかもしれないですが…笑

初学者の方も、これを機にRevelに触れてみていただけたら嬉しいです。

次回はLINE Login APIとDBを用いたログイン機能を実装していきたいと思います。

Revelカテゴリの最新記事