58
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Docker ComposeでElixir/Phoenixの開発環境を構築する

はじめに

この記事では、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 というディレクトリを作成し、次に示す Dockerfiledocker-compose.yml をディレクトリ内に格納してください。

my-app/Dockerfile
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
my-app/docker-compose.yml
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 を以下のように変更します。

my-app/config/dev.exs
...

# 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 のデフォルトの初期ページが表示されれば成功です。
image.png

開発中の操作

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 に格納したデータも削除されるので注意してください。

参考

Dockerizing a Phoenix Application

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
58
Help us understand the problem. What are the problem?