キュアセブン技術ブログ

考えたこと,学んだことを書きます

Dockerでgo環境を作る

isucon9予選の問題を使ってGoの環境をDockerで作ってみた。

f:id:shiningcureseven:20200713123701j:plain
全体像

github.com

※ isucon9予選の問題中に外部サービスへのアクセスがあって、運営が用意してくれてるそれにアクセスしないと全部の機能が使えない

やったことメモ

web

今回はnginxだった。
設定ファイルを読み込むためにDockerfileをbuildすることでコンテナを作ることにした。
webapp配下にwebサーバマウント用ディレクトweb を作って、そこに

  • default.conf
  • Dockerfile

をおいた。

app

  • goは以下の機能を持っている(php-fpm的)
    • リクエスト解釈
    • 実行
  • goはコンパイルするのでバイナリファイルさえあれば大丈夫。
    • appにはbusyboxを採用した。(バイナリファイル実行するくん)
  • docker-compose
    • environmentにmysqlにアクセスするための環境変数をセットした。これはソースコードにしたがって書いた。
    • commandにバイナリファイル実行するように書いた。
  • working_dirを書かないと動かなかった。コンテナの、バイナリファイルがあるディレクトリを指定した。

  • ちなみにGoコンパイルMakefileに書いてあるので $ make isucon したらできた

db

今回はMySQLだったのでdockerhubからimage取ってきた。

  • docker-compose
    • 文字コードを指定するためにcommandに実行コマンドを記述した。デフォルトは mysqld
  • dockerを落とすとコンテナ内のデータが飛ぶので、データの実体があるディレクトリをローカルにマウントしておくことにした。
    • webapp内にディレクトdb を作ってそこにマウントした
  • コンテナ内 docker-entrypoint-initdb.d 内の .sh, .sql, .sql.gz が最初に実行されるので、実行したいファイルがある webapp/sqldocker-entrypoint-initdb.dにマウントした。

Docker Hub

  • webapp/sql に必要なテーブルをcreateするクエリが入っていなかった。予選当日なら本番環境のテーブルを見に行って、真似してクエリ作れば良い。