よりひろい フロントエンド
Author : Kazuhiro Hara
Author : Kazuhiro Hara
Mon Oct 28 2024

Vapor の新規プロジェクトに付属する Docker 周りのファイルについて

visionOS 勉強会 #7 にて発表した Vapor の話題の中で、プロジェクトを生成すると docker-compose.ymlDockerfile もついてきますよという話をした。今回はその関係の補足。

ちなみに、前回書いた記事に発表資料本体があるので、興味のある方はぜひ。

さて、今回は 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 の説明などもあり、ぜひ読んでおきたいドキュメントの一つだ。

VaporDockerSwiftXcode

Share

About site

カンソクインダストリーズのロゴ

「よりひろいフロントエンド」運営元 カンソクインダストリーズ では、フロントエンドを中心によろずご相談お受けいたします。お気軽にお問い合わせください。