diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..76f9aaa --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/playwright:v1.58.1-noble AS base + +WORKDIR /app + +ENV CI=1 + +RUN corepack enable && corepack prepare pnpm@10.23.0 --activate + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +RUN pnpm install --frozen-lockfile + +FROM base AS build + +COPY . . +RUN pnpm build + +FROM docker.io/library/nginx:1.27-alpine AS site + +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md index 032cbbb..0a4c280 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ - [Vagrant](https://www.vagrantup.com/) - PHP練習用環境 - [Docker](https://www.docker.com/) + - AlmaLinux など Playwright 非対応環境でのサイトビルド + - [Docker](https://www.docker.com/) pnpmがインストールされていない場合は、以下のコマンドでインストールしてください。 @@ -44,6 +46,39 @@ 開発サーバーが起動し、ブラウザで にアクセスできます。 ファイルを編集すると、自動的にブラウザがリロードされます。 +## AlmaLinux などで Docker / Podman を使ってビルドする + +このサイトは Mermaid の画像生成のために Playwright を利用しています。 +そのため、Playwright が公式サポートしていない OS では、`pnpm build` が失敗することがあります。 + +その場合は、Playwright 公式イメージの中でビルドしてください。 + +```sh +pnpm build:docker +``` + +Podman を使う場合は、以下のコマンドを実行してください。 + +```sh +pnpm build:podman +``` + +ビルドが成功すると、成果物がホスト側の `./dist/` に出力されます。 +この `dist/` を Web サーバーに配置すれば、そのまま公開できます。 + +## Docker / Podman イメージとして公開する + +静的サイトをそのままコンテナで公開したい場合は、以下のようにビルドして起動できます。 + +```sh +docker build -t hello-programmer-world . +docker run --rm -p 8080:80 hello-programmer-world +``` + +起動後は で確認できます。 + +Podman の場合も、`docker` を `podman` に読み替えれば同様に実行できます。 + ## コマンドライン操作の練習用仮想環境の利用(任意) [./vagrant/README.md](./vagrant/README.md) をご確認ください。 diff --git a/docker-compose.build.yml b/docker-compose.build.yml new file mode 100644 index 0000000..5a044dd --- /dev/null +++ b/docker-compose.build.yml @@ -0,0 +1,9 @@ +services: + site-build: + build: + context: . + target: build + user: "${UID:-1000}:${GID:-1000}" + command: sh -lc 'find /output -mindepth 1 -maxdepth 1 -exec rm -rf {} + && cp -R /app/dist/. /output/' + volumes: + - ./dist:/output diff --git a/package.json b/package.json index e4ab91f..e9481cc 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "scripts": { "dev": "astro dev", "build": "astro build", + "build:docker": "UID=$(id -u) GID=$(id -g) docker compose -f docker-compose.build.yml run --build --rm site-build", + "build:podman": "sh ./scripts/build-with-podman.sh", "preview": "astro preview", "astro": "astro" }, diff --git a/scripts/build-with-podman.sh b/scripts/build-with-podman.sh new file mode 100644 index 0000000..ddb5565 --- /dev/null +++ b/scripts/build-with-podman.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +set -eu + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +PROJECT_DIR=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd) +OUTPUT_DIR="$PROJECT_DIR/dist" +IMAGE_TAG="${PODMAN_BUILD_IMAGE:-hello-programmer-world:podman-build}" + +mkdir -p "$OUTPUT_DIR" + +podman build --target build -t "$IMAGE_TAG" "$PROJECT_DIR" + +podman run --rm \ + --userns keep-id \ + -v "$OUTPUT_DIR:/output:Z" \ + "$IMAGE_TAG" \ + sh -lc 'find /output -mindepth 1 -maxdepth 1 -exec rm -rf {} + && cp -R /app/dist/. /output/'