落ち着いてきたのでPhoenixにしっかり入門しようと思いPhoeinxの環境を構築してみた。
以前、雑にGKEに乗っけるための記事を書いたりしたがそこから期間が空いてしまいPhoenixに関するいろいろな記憶が失われていたため再構築中
今回は手元にDockerを使ってPhoenixの開発に必要な環境を構築したので備忘録とす
想定読者
- ぼく
- Phoenixを追いかけ始めた新米錬金術師
Dockerfile
早速ですが試行錯誤の末に完成したDockerfileです
FROM elixir:1.9.0
WORKDIR /app
RUN apt-get update && \
curl -sL https://deb.nodesource.com/setup_10.x | bash - && \
apt-get install -y nodejs npm inotify-tools
RUN mix local.hex --force && \
mix archive.install --force https://github.com/phoenixframework/archives/raw/master/phx_new.ez && \
mix local.rebar --force
COPY mix.exs mix.exs
COPY mix.lock mix.lock
RUN mix deps.get && mix compile
COPY assets/package.json assets/package.json
COPY assets/package-lock.json assets/package-lock.json
RUN cd assets && npm install
EXPOSE 4000
COPY . .
ポイントはDockerfileの時点で mix deps.get && mix compileしていること
これしとくことでKubernetesに乗っけたときも即起動するはず...たぶん(動かしてない)
docker-compose.yml
こちらも早速
version: '3.2'
services:
app:
build: .
ports:
- "4000:4000"
command: tail -f /dev/null # 開発用なのでコンテナ内でiex -S mix phx.serverする前提
environment:
- MIX_ENV=dev
- PORT=4000
- DATABASE_USER=postgres
- DATABASE_PASSWORD=postgres
- DATABASE_NAME=postgres
- DATABASE_HOST=db
- DATABASE_URL=ecto://postgres:postgres@db/postgres # NOTE: これはproductionで動かすときに使う
- SECRET_KEY_BASE=
volumes:
- .:/app
depends_on:
- db
db:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_HOST=db
- POSTGRES_DB=postgres
先に書いたDockerfileを使ってローカルで開発するとちょっとボリュームの共有がやりづらくなってしまう(´・ω・`)
これはDockerfile内でassetsとpackageをコンパイルしているがローカルには存在しないため手元のコードをマウントすると_buildとassetsの成果物が失われるため(´・ω・`)
ただ、ローカル開発だけならパッケージを追加しない限りは一度 mix compileしておけば再コンパイルの必要はない。assetsも同じ
最初にやること
docker-compose pull
docker-compose build
docker-compose up -d
docker-compose exec app bash -c "cd assets && npm install"
docker-compose exec app mix deps.get && mix compile
↑のコードを順次実行することでローカル開発の準備完了
さいごに
これで手元のコードを編集して普段どおりに開発するだけで問題ないはず
Dockerfileの内容的にはKubernetesにデプロイしてもデプロイ後からmix compileが始まるみたいなことは起きないはずなので
安心して運用できる気がします(未検証)