如何将 Astro 容器化并部署
如果您只是想复制粘贴,以下是最终的 Dockerfile 文件,它将为您的 Astro 应用生成镜像:
FROM node:20-alpine AS base
WORKDIR /app
# By copying only the package.json and package-lock.json here, we ensure that the following `-deps` steps are independent of the source code.
# Therefore, the `-deps` steps will be skipped if only the source code changes.
COPY package.json package-lock.json ./
FROM base AS prod-deps
RUN npm install --omit=dev
FROM base AS build-deps
RUN npm install
FROM build-deps AS build
COPY . .
RUN npm run build
FROM base AS runtime
COPY --from=prod-deps /app/node_modules ./node_modules # Copy dependencies
COPY --from=build /app/dist ./dist # Copy the built output
# Bind to all interfaces
ENV HOST=0.0.0.0
# Port to listen on
ENV PORT=4321
# Just convention, not required
EXPOSE 4321
CMD node ./dist/server/entry.mjs # Start the app
这是 .dockerignore 文件:
.DS_Store
node_modules
dist
要构建和运行镜像,请使用以下命令:
docker build -t astro .
docker run -p 4321:4321 astro
不只是来复制粘贴的吗?让我们一起来看看 Dockerfile 里到底发生了什么!
准备工作
本教程假设您已搭建好基本的 Astro 项目。如果您采用不同的设置,则可能需要相应地调整 Dockerfile 文件。
通常情况下,本地开发需要先运行 `npm install`,再运行 `npm run dev`。但是,部署应用时,我们需要构建应用并从服务器提供文件。因此,我们将使用 `npm run build` 来创建文件,然后再提供这些文件。
让我们深入了解一下 Dockerfile 的细节。
Dockerfile
FROM node:20-alpine AS base
WORKDIR /app
# By copying only the package.json and package-lock.json here, we ensure that the following `-deps` steps are independent of the source code.
# Therefore, the `-deps` steps will be skipped if only the source code changes.
COPY package.json package-lock.json ./
FROM base AS prod-deps
RUN npm install --omit=dev
FROM base AS build-deps
RUN npm install
FROM build-deps AS build
COPY . .
RUN npm run build
FROM base AS runtime
COPY --from=prod-deps /app/node_modules ./node_modules # Copy dependencies
COPY --from=build /app/dist ./dist # Copy the built output
# Bind to all interfaces
ENV HOST=0.0.0.0
# Port to listen on
ENV PORT=4321
# Just convention, not required
EXPOSE 4321
CMD node ./dist/server/entry.mjs # Start the app
所以这里到底发生了什么?
- 基础阶段:
- 使用基于 Alpine 的 Node.js 20,提供轻量级的基础镜像。
- 设置工作目录并复制软件包文件以进行依赖项安装。
- 生产依赖阶段:
- 仅安装生产依赖项,不安装开发依赖项。
- 构建依赖项阶段:
- 安装所有依赖项,包括构建所需的开发依赖项。
- 构建阶段:
- 复制整个项目并运行构建命令。
- 运行时阶段:
- 从基础图像重新开始。
- 从之前的阶段复制生产依赖项和构建文件。
- 设置主机和端口的环境变量。
- 暴露端口 4321(Astro 的默认端口)。
- 使用内置服务器入口点启动 Astro 应用程序。
这种多阶段构建方法通过分离构建环境和运行时环境来优化构建过程并减小最终镜像的大小。
请务必添加.dockerignore文件以忽略 `<build>`node_modules和 ` dist<run>` 文件夹。这将加快构建过程并减小镜像大小。
部署
您可以将此 Docker 容器部署到任何支持 Docker 的云服务提供商。例如,您可以使用 Heroku、DigitalOcean 或 AWS ECS 等平台。由于我是Sliplane的联合创始人,我将向您展示如何在这些平台上部署它。
注册后,您可以通过选择您的 GitHub 仓库来创建新服务。然后只需保留默认设置并单击“部署”即可。
部署完成后,您的天文应用将可通过sliplane.app的子域名访问,通常就是您的服务名称。
您还可以查看应用日志、CPU 和内存使用情况等指标、添加持久存储等等。每次您向代码仓库推送代码时,Sliplane 都会自动部署您的应用。
如果你想试试Sliplane,前两天免费!试试看,然后告诉我你的想法 :)
后续步骤
您还有其他想了解的吗?您需要帮助将 Astro 应用容器化吗?您需要帮助将其部署到特定平台吗?欢迎随时联系我!您可以在X
上找到我,或者直接在本博客留言。
干杯,
乔纳斯
文章来源:https://dev.to/code42cate/how-to-dockerize-and-deploy-astro-6ll

