経緯
現在のプロジェクトでは開発環境もプロダクションもDockerfileをビルドしてセットアップしています。プロダクション環境ではデータベースはAmazon RDSでMySQLを利用しているのでDockerfileにMySQLをインストールするコードを書く必要はないのですが、開発環境ではローカルのデータベースが必要になります。当初は普通にapt-getとかをDockerfileに書いていたのですが、MySQLの起動時にログ用のディレクトリがないとか、mysqld.sockにアクセスできないとか怒られていたので、Dockerビルドしたあとに手動でMySQLを入れていました。しかし、やっぱり1コマンドですべての環境が構築できればなと思い、苦労した結果MySQLもセットアップできるようになりました。
Dockerfile
FROM ubuntu:15.10
MAINTAINER takuma
.
.
.
RUN echo "mysql-server mysql-server/root_password password ***" | debconf-set-selections && \
echo "mysql-server mysql-server/root_password_again password ***" | debconf-set-selections && \
apt-get -y install mysql-server
RUN mkdir /home/mysql
RUN chown mysql /home/mysql
RUN chgrp mysql /home/mysql
RUN usermod -d /home/mysql mysql
RUN mysql_install_db
.
.
.
DockerfileのMySQLに関する部分はこんな感じになっています。Dockerfile中に/etc/init.d/mysql start
とかやってもdocker build
が終わったあとはまた止まってしまいます。なので、ここではMySQLを入れるだけで、MySQLの起動は別スクリプトで行います。
build.sh
docker build -t hoge/huga:dev .
docker run -p 80:80 --name huga -t -d hoge/huga:dev
.
.
.
docker exec huga /etc/init.d/mysql start
docker exec huga mysql -u root -e "create database hoge;"
.
.
.
このスクリプトでdocker build
とdocker run
を行いつつ、docker exec
でデータベースの起動とプロジェクトに必要なデータベースの作成を行っています。この手順で起動したMySQLにはパスワードがかかっていませんが、開発環境用ならいいでしょう。Dockerfileの書き方は記事がたくさん書かれているのでそちらを参考にしてください。