先月、弊社の勉強会にて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内では以下のようなことを行っています。
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を用いたログイン機能を実装していきたいと思います。