はじめに
この記事では、Docker Compose を使用した Phoenix アプリケーションの開発環境構築について説明します。なおこの記事は、次のバージョンに基づいて説明しています。
Elixir: 1.8.1
Phoenix: 1.4.3
Node.js: 10.x
Docker: 18.09
また、以降の説明は my-app
ディレクトリに my_app
というアプリケーションを構築するという前提で進めます。
Docker ファイルの作成
まず最初に Docker のファイルをプロジェクトのディレクトリに配置します。適当な場所に my-app
というディレクトリを作成し、次に示す Dockerfile
と docker-compose.yml
をディレクトリ内に格納してください。
FROM elixir:1.8.1
ENV NODE_VERSION 10.x
RUN curl -sL https://deb.nodesource.com/setup_${NODE_VERSION} | bash \
&& apt-get install -y nodejs
RUN npm install npm@latest -g
RUN mix local.hex --force && \
mix archive.install hex phx_new 1.4.3 --force && \
mix local.rebar --force
WORKDIR /app
version: '3.2'
services:
web:
build: .
ports:
- '4000:4000'
command: mix phx.server
environment:
- MIX_ENV=dev
- PORT=4000
volumes:
- .:/app
db:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_HOST=db
Phoenix プロジェクトの準備
プロジェクトの生成
それでは mix phx.new
コマンドで Phoenix プロジェクトを新規作成しましょう。my-app
ディレクトリで次のコマンドを実行してください。
$ docker-compose run web mix phx.new . --app my_app
実行中、以下のような確認メッセージが表示されますが、 y
を入力して処理を続行してください。
The directory /app already exists. Are you sure you want to continue? [Yn]
Fetch and install dependencies? [Yn]
上記の処理が完了すると、以下のようなファイル/ディレクトリが作成されているはずです。
my-app
├── _build
├── assets
├── config
├── deps
├── libs
├── priv
├── test
├── .formatter.exs
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── mix.exs
├── mix.lock
└── README.md
DB のセットアップ
続いて DB のセットアップを行います。Phoenix はデフォルトで PostgreSQL を使用するので、ここではそのまま PostgreSQL を利用することとします。
設定ファイルの変更
my-app/config/dev.exs
を開き、Postgres の hostname を以下のように変更します。
...
# Configure your database
config :my_app, MyApp.Repo,
adapter: Ecto.Adapters.Postgres,
username: "postgres",
password: "postgres",
database: "my_app_dev",
hostname: "db",
pool_size: 10
docker-compose の実行
docker-compose.yml
で定義している各 service を立ち上げます。次の docker-compose
コマンドを実行してください。
$ docker-compose up -d
コンパイルとマイグレーション
最後に以下のコマンドを実行して、依存ライブラリのコンパイルと DB のマイグレーションを行います。
$ docker-compose run web bash -c "mix deps.compile && mix ecto.create && mix ecto.migrate"
実行確認
ブラウザで http://localhost:4000
という URL を指定してください。次のような Phoenix のデフォルトの初期ページが表示されれば成功です。
開発中の操作
Docker コンテナでコマンドを実行する
実行中の Docker コンテナに対してコマンドを実行する場合、次のようにdocker-compose run
を使用します。
$ docker-compose run web mix hex.info
ここでは、web
という service に対して、mix hex.info
というコマンドを実行しています。
また、ssh のようにコンテナの中で継続してコマンドを実行する場合、docker exec -it
を使用します。
$ docker exec -it {コンテナのID} bash
コンテナの停止
docker-compose up -d
によって立ち上げた Docker コンテナを停止する場合、以下のコマンドを実行します。
$ docker-compose stop
なお、コンテナの停止だけでなく、コンテナ、ボリュームの削除まで行う場合は、次のようにdown
を指定します。
$ docker-compose down
このコマンドを実行すると、開発中に PostgreSQL に格納したデータも削除されるので注意してください。