🦙

WSL2 環境に Docker と Elixir と PostgreSQL をインストールしよう

2024/04/21に公開

動画

準備中

Docker をインストールする

Ubuntu ターミナルを起動して、以下のコマンドを順に実行してください。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Ubuntuユーザーのパスワードの入力をしてください。しばらくして次のようなメッセージが表示されれば、Docker のインストールが完了しています。

念のため、docker --version コマンドを実行して、Docker のバージョン番号を確認してください。動画収録時の Docker の最新バージョン番号は 26.0.2 でした。

続いて、次のコマンドを実行してください。

sudo usermod -aG docker $USER

その後、Ubuntu ターミナルを終了し、起動し直してください。

参考資料

プロジェクトディレクトリを作成する

Ubuntuターミナル上でプロジェクトディレクトリを作成します。名前は何でも構いません。この動画では projects/my_app としました。

次のコマンドを実行してください。

mkdir -p projects/my_app
cd projects/my_app

Dockerfile を作成する

code . コマンドで VS Code を起動してください。まだ VS Code をインストールしていない方は、◯◯◯を参照してください。VS Code の代わりに Vim や Nano を利用しても構いません。

プロジェクトのルートディレクトリに次の内容を持つ Dockerfile (拡張子なし)を作成してください。

FROM elixir:1.16.0

ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes

RUN apt-get update && apt-get -y install apt-file && apt-file update
RUN apt-get -y upgrade

RUN apt-get -y install bash git vim sudo curl inotify-tools imagemagick ffmpeg cmake erlang-dev \
    ca-certificates gnupg postgresql-client

RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | \
    gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg

ENV NODE_MAJOR=20
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" > /etc/apt/sources.list.d/nodesource.list
RUN apt-get update && apt-get -y install nodejs

RUN echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf

ARG UID=1000
ARG GID=1000

RUN groupadd -g $GID devel
RUN useradd -u $UID -g devel -m devel
RUN echo "devel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

COPY --chown=devel:devel . /app

USER devel

WORKDIR /app

RUN mix local.hex --force
RUN mix local.rebar --force

docker-compose.yml を作成する

続いて、プロジェクトのルートディレクトリに次の内容を持つ docker-compose.yml を作成してください。

services:
  db:
    image: postgres:16.2
    volumes:
      - db_data:/var/lib/postgresql/data:cached
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
  app:
    build: .
    volumes:
      - .:/app:cached
    working_dir: /app
    ports:
      - "4000:4000"
    depends_on:
      - db
    tty: true
volumes:
  db_data:

コンテナの起動、動作確認、終了

app コンテナのビルド

id -u コマンドの実行結果を確認してください。通常は、「1000」と表示されます。

「1000」と表示された場合は、次のコマンドを実行してください

docker compose build --no-cache app

「1001」とか「1002」のように「1000」と表示されない場合は、次のコマンドを実行してください

docker compose build --no-cache --build-arg UID=$(id -u) --build-arg GID=$(id -g) app

コンテナ群を起動する

docker compose up -d コマンドを実行してください。

コンテナ群の状態を確認する

docker compose ps コマンドを実行してください。次のように表示されれば、すべてのコンテナ群が起動されています。

app コンテナの中に入る

docker compose exec app bash コマンドを実行し、app コンテナの中に入ります。

Elixir のバージョンを確認する

app コンテナの中で elixir --version コマンドを実行してください。動画収録時点では、次のように表示されました:

Erlang/OTP 26 [erts-14.1.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.16.2 (compiled with Erlang/OTP 24)

PostgreSQL に接続できることを確認する

app コンテナの中で psql -h db -U postgres コマンドを実行してください。

「Password for user postgres:」というプロンプトに対して、「password」と入力してください。

ターミナルに次のように表示されれば接続に成功しています:

psql (15.6 (Debian 15.6-0+deb12u1), server 16.2 (Debian 16.2-1.pgdg120+2))
WARNING: psql major version 15, server major version 16.
         Some psql features might not work.
Type "help" for help.

postgres=# 

キーボードから Ctrl-D を入力して PostgreSQL コンソールからログアウトしてください。

コンテナ群を終了する

docker-compose stop を実行し、コンテナ群を終了してください。

Phoenix アプリの骨格を作る

phx_new パッケージのインストール

docker compose up -d コマンドを実行し、改めてコンテナ群を起動します。そして、docker compose exec app bash コマンドで、app コンテナの中に入ります。

そして、mix archive.install hex phx_new 1.7.12 コマンドを実行してください。

このコマンドにより、Phoenix のソースコードの骨格を生成する mix_new パッケージがインストールされます。

ソースコードの骨格を生成する

app コンテナの中で以下のコマンドを順に実行してください。

mix phx.new my_app
mv my_app/* .
mv my_app/.* .

config/dev.exs を書き換える

VS Code で config/dev.exs を開きます。すると次のような内容が表示されます:

import Config

# Configure your database
config :my_app, MyApp.Repo,
  username: "postgres",
  password: "postgres",
  hostname: "localhost",
  database: "my_app_dev",
  stacktrace: true,
  show_sensitive_data_on_connection_error: true,
  pool_size: 10

localhostdb に書き換えてファイルを保存してください。

データベースを作成する

app コンテナの中で mix ecto.create コマンドを実行してください。

ターミナルに「The database for MyApp.Repo has been created」と表示されれば成功です。

Discussion