Vapor の新規プロジェクトに付属する Docker 周りのファイルについて
visionOS 勉強会 #7 にて発表した Vapor の話題の中で、プロジェクトを生成すると docker-compose.yml
と Dockerfile
もついてきますよという話をした。今回はその関係の補足。
ちなみに、前回書いた記事に発表資料本体があるので、興味のある方はぜひ。
さて、今回は Vapor の Docker 周りの話。
ローカル環境にある Docker 環境上で Vapor アプリのコンテナを起動するのは非常に簡単に行える。
まずは、Docker image の作成。Vapor で作られたアプリはローカル起動時でもビルド後実行がされるが、Docker コンテナは ubuntu ベースの環境上で動作するようであり、従って ubuntu 上でのビルドが必要となる。そのため、起動する場合はまずはイメージのビルドからすることになる。ということでまずは以下を実行。
$ docker compose build
プロジェクトには以下の内容を含んだ .dockerignore
というファイルも含まれており、Mac 上でビルドしたファイルは除外してコンテナを構築するようになっている。これには Swift Package ファイルも含まれる。
.build/
.swiftpm/
Docker イメージの作成が完了したらサービスを起動すれば OK。
$ docker compose up
docker-compose.yml
を見てみると app
というアプリケーションのみが定義されている。いろいろと自分でカスタマイズしてアプリケーションを構築したい人は、ここから始めるといいと思う。
version: '3.7'
x-shared_environment: &shared_environment
LOG_LEVEL: ${LOG_LEVEL:-debug}
services:
app:
image: websocket-1:latest
build:
context: .
environment:
<<: *shared_environment
ports:
- '8080:8080'
# user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
しかし、fluent を使って DB 連携の Web アプリケーションを作ろうと思うと、つまりプロジェクト作成時に fluent を使うことを選択し、任意の RDB を選択すると以下のような docker-compose.yml
が生成される。db_data
というデータベース用のボリューム、そしてデータベース関係のサービスが含まれている。
version: '3.7'
volumes:
db_data:
x-shared_environment: &shared_environment
LOG_LEVEL: ${LOG_LEVEL:-debug}
DATABASE_HOST: db
DATABASE_NAME: vapor_database
DATABASE_USERNAME: vapor_username
DATABASE_PASSWORD: vapor_password
services:
app:
image: hello-db:latest
build:
context: .
environment:
<<: *shared_environment
depends_on:
- db
ports:
- '8080:8080'
# user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
migrate:
image: hello-db:latest
build:
context: .
environment:
<<: *shared_environment
depends_on:
- db
command: ["migrate", "--yes"]
deploy:
replicas: 0
revert:
image: hello-db:latest
build:
context: .
environment:
<<: *shared_environment
depends_on:
- db
command: ["migrate", "--revert", "--yes"]
deploy:
replicas: 0
db:
image: mysql:8
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_USER: vapor_username
MYSQL_PASSWORD: vapor_password
MYSQL_DATABASE: vapor_database
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
ports:
- '3306:3306'
自分で使う際にはいろいろとカスタマイズすることになると思うが、雛形が用意されているのは大変ありがたい。ちなみに Docker 周りのドキュメントは以下にある。Dockerfile の説明などもあり、ぜひ読んでおきたいドキュメントの一つだ。