如何将 Astro 容器化并部署?
如果你只是想直接复制粘贴,这里是你的Astro应用所需的最终Dockerfile,可以用来生成镜像:
FROM node:20-alpine AS base
WORKDIR /app
# 只复制 package.json 和 package-lock.json 文件,确保以下的 `-deps` 步骤独立于源代码。
# 因此,如果只更改源代码,`-deps` 步骤将会被跳过。
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 --from=build /app/dist ./dist # 复制构建输出:
# 绑定到所有网络接口:
ENV HOST=0.0.0.0
# 监听的端口:
ENV PORT=4321
# 仅为约定,非强制:
EXPOSE 4321
CMD node ./dist/server/entry.mjs # 启动应用程序
全屏模式 退出全屏
下面是一个.dockerignore文件。
.DS_Store
node_modules
dist
全屏模式(按ESC退出).
要构建并运行 Docker 镜像,请使用以下命令:
先构建名为astro的Docker镜像,然后运行它并映射端口4321:
docker build -t astro .
docker run -p 4321:4321 astro
全屏 退出全屏
不只是来复制粘贴就走的吧?那我们来看看Dockerfile里都有哪些内容吧!
背景本教程假设你已经设置了一个基本的 Astro 项目。如果你的设置不同,你可能需要相应地调整 Dockerfile。
通常,你会运行 npm install
然后运行 npm run dev
来本地运行。不过,在部署时,我们希望构建应用并生成文件,通过服务器提供这些文件。因此,我们将使用 npm run build
来生成文件,然后通过服务器提供这些文件。
让我们来深入了解一下Dockerfile吧。
Docker文件: FROM node:20-alpine AS base
WORKDIR /app
# 仅复制 package.json 和 package-lock.json 文件到此,确保以下 `-deps` 步骤与源代码独立。
# 因此,如果仅更改源代码,那么 `-deps` 步骤将不会执行。
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 # 从 `prod-deps` 复制到 `/app/node_modules`
COPY --from=build /app/dist ./dist # 从 `build` 复制到 `/app/dist`
# 绑定到所有接口
ENV HOST=0.0.0.0
# 监听端口
ENV PORT=4321
# 仅为约定,非强制
EXPOSE 4321
CMD node ./dist/server/entry.mjs # 启动应用程序
全屏进入。
全屏退出。
这里到底发生了什么事?
- 基础阶段:
-
基于Node.js 20和Alpine,提供一个轻量级的基础镜像。
-
设置工作目录,并复制包文件用于安装依赖项。
- 生产依赖项安装阶段:
-
仅安装生产依赖,排除开发依赖。
- 构建依赖阶段:
-
安装所有依赖项,包括用于构建的开发依赖项。
- 构建阶段:
-
复制整个项目并执行构建命令。
- 运行时阶段:
-
从基础镜像重启。
-
复制生产依赖项和构建文件。
-
设置主机和端口的环境变量值。
-
开放端口4321(Astro的默认端口)。
- 使用构建的服务器入口点启动Astro应用服务。
这种分阶段的方法不仅优化了构建过程,还通过分离构建环境和运行时环境来保持最终镜像的较小尺寸。
确保将 .dockerignore
文件添加到项目中以忽略 node_modules
和 dist
文件夹。
这将加快构建过程并减小镜像的大小。
你可以将这个 Docker 容器部署到任何支持 Docker 的云提供商上。比如,你可以选择使用像 Heroku、DigitalOcean 或 AWS ECS 这样的平台。因为我也是 Sliplane 的联合创始人之一,我会向你展示如何在 Sliplane 上部署它。
注册之后,你可以通过选择你的Github仓库来创建服务。然后只需保持默认设置不变,并点击部署按钮。
部署完成后,您的 Astro 应用程序将在 sliplane.app 的一个子域下可用,通常就是您的服务名。
你也可以查看应用程序的日志信息,查看指标如 CPU 和内存使用,添加持久化存储等功能。每次您推送代码到仓库时,Sliplane 会自动部署您的应用。
试试Sliplane,前两天免费哦!然后告诉我你的想法,好吗 :)
下一步行动还有其他想知道的吗?需要帮忙把你的Astro应用容器化吗?需要帮忙把应用部署到特定平台吗?随时联系,没问题!
你可以在X上找到我,或直接在本文下方留言。
好了
Jonas
共同学习,写下你的评论
评论加载中...
作者其他优质文章