🤖

AstroサイトをDockerで動かす

2025/02/24に公開

Dockerコンテナを徐々に理解し始めたので、Rancher Desktopでコンテナとして管理しようと考えた。
しかし、Astroサイトをコンテナ化する方法がうまく見つけられず、断片的に得られた下記情報をもとに整理した。

これらをもとに、Bun+Astroで構築するWebサイト(静的ページ)をコンテナ化した
おおよそ、コンテナイメージを作成するまでは、Bunでの説明を参考にし、
コンテナイメージの最終段階(コンテンツの配置やポート設定)は、Astroでの説明を参考とした。

確認できたDockerFileは下記の通り。

# use the official Bun image
# see all versions at https://hub.docker.com/r/oven/bun/tags
FROM oven/bun:1 AS base
WORKDIR /usr/src/app

# install dependencies into temp directory
# this will cache them and speed up future builds
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile

# install with --production (exclude devDependencies)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production

# copy node_modules from temp directory
# then copy all (non-ignored) project files into the image
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .

# [optional] tests & build
ENV NODE_ENV=production
# RUN bun test
RUN bunx --bun astro build

# copy production dependencies and source code into final image
FROM base AS release
COPY --from=install /temp/prod/node_modules node_modules
COPY --from=prerelease /usr/src/app/dist dist
COPY --from=prerelease /usr/src/app/package.json .

# static Apache(httpd)
FROM httpd:2.4 AS runtime
COPY --from=release --chmod=755 /usr/src/app/dist /usr/local/apache2/htdocs/
EXPOSE 80

作成したDockerFileでコンテナをビルドする

docker build --pull -t bun-astro .

また、コンテナの起動については、今までの経験則から80番ポートを避けて、8000番台に割り当てれば起動できることを確認した。

docker run --name Astro_Sample -d -p 8000:80 bun-astro

コンテナ側は80番のままで、ローカル側を8000番としているため、以下の通りアクセスする

http://localhost:8000

Discussion