用 Docker 来构建你的 Astro 网站
Docker 是一个使用容器构建、部署和运行应用程序的工具。
Docker 镜像和容器可以部署到许多不同的平台,例如 AWS、Azure 和 Google Cloud。本节示例不聚焦于如何将网站部署到特定平台,而是会展示如何将你的项目与 Docker 整合。
前期准备
标题部分 前期准备- 在你的本地机器上安装 Docker。你可以在此处找到适用于你的操作系统的安装指南。
- 在你的项目中创建一个 Dockerfile。你可以在此处了解有关 Dockerfile 的更多信息,并使用下面的示例作为开始来编写 Dockerfile。
创建 Dockerfile
标题部分 创建 Dockerfile在项目根目录中创建一个名为 Dockerfile
的文件,这个文件包含了构建你的网站的指令,具体指令会根据你的需求而有所不同。本指南无法展示所有可能的选项,但会为 SSR 和静态渲染模式提供一些起始的步骤。
如果你使用的是除了 npm 之外的包管理工具,可能需要你相应地调整命令。
服务端渲染模式(SSR)
标题部分 服务端渲染模式(SSR)以下是一个 Dockerfile 示例,它将使用 Node.js 构建你的网站,并在端口 3000
上进行服务。这要求在 Astro 项目中安装了 Node 适配器。
FROM node:lts AS runtimeWORKDIR /app
COPY . .
RUN npm installRUN npm run build
ENV HOST=0.0.0.0ENV PORT=3000EXPOSE 3000CMD node ./dist/server/entry.mjs
添加 .dockerignore
标题部分 添加 .dockerignore将 .dockerignore
文件添加到你的项目中是一个最佳实践。这个文件非常类似于 .gitignore
,用于描述在 Docker 的 COPY
或 ADD
命令中应该忽略哪些文件或文件夹,从而加快构建过程并减小最终镜像的大小。
.DS_Storenode_modulesdist
这个文件应该放在与 Dockerfile
相同的目录下。可阅读 .dockerignore
文档获取更多信息。
静态渲染模式
标题部分 静态渲染模式Apache (httpd)
标题部分 Apache (httpd)以下是一个 Dockerfile 示例,它将构建你的网站,并使用 Apache httpd 默认配置的 80
端口提供服务。
FROM node:lts AS buildWORKDIR /appCOPY . .RUN npm iRUN npm run build
FROM httpd:2.4 AS runtimeCOPY --from=build /app/dist /usr/local/apache2/htdocs/EXPOSE 80
NGINX
标题部分 NGINXFROM node:lts AS buildWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .RUN npm run build
FROM nginx:alpine AS runtimeCOPY ./nginx/nginx.conf /etc/nginx/nginx.confCOPY --from=build /app/dist /usr/share/nginx/htmlEXPOSE 8080
为了构建上面的 Dockerfile,你还需要为 NGINX 创建一个配置文件。在项目的根目录下创建一个名为 nginx
的文件夹,并在其中创建一个名为 nginx.conf
的文件。
worker_processes 1;
events { worker_connections 1024;}
http { server { listen 8080; server_name _;
root /usr/share/nginx/html; index index.html index.htm; include /etc/nginx/mime.types;
gzip on; gzip_min_length 1000; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
location / { try_files $uri $uri/index.html $uri.html; } }}
多层构建(使用 SSR)
标题部分 多层构建(使用 SSR)下面是一个更高级的 Dockerfile 示例,通过 Docker 的 多层构建 功能,仅在源代码变化时重新安装 npm 依赖项,从而优化了站点的构建过程。这根据依赖项的大小从而节省几分钟甚至更多的构建时间。
FROM node:lts AS baseWORKDIR /app# 这里仅复制 package.json 和 package-lock.json,我们确保以下的 `-deps` 步骤与源代码无关。# 因此,如果只有源代码发生变化,将会跳过 `-deps` 步骤。COPY package.json package-lock.json ./FROM base AS prod-depsRUN npm install --productionFROM base AS build-depsRUN npm install --production=falseFROM build-deps AS buildCOPY . .RUN npm run buildFROM base AS runtimeCOPY --from=prod-deps /app/node_modules ./node_modulesCOPY --from=build /app/dist ./distENV HOST=0.0.0.0ENV PORT=3000EXPOSE 3000CMD node ./dist/server/entry.mjs
操作步骤
标题部分 操作步骤- 在项目的根目录中运行以下命令来构建容器。可将
<your-astro-image-name>
替换为任意名称:
docker build -t <your-astro-image-name> .
这将生成一个镜像,你可以在本地运行它或部署到你偏好的平台上。
- 要将镜像作为本地容器运行,请使用以下命令。
将 <local-port>
替换为你本地机器上的空闲端口。将 <container-port>
替换为你的 Docker 容器暴露的端口号(如上面示例中的 3000
、80
或 8080
)。
docker run -p <local-port>:<container-port> <your-astro-image-name>
接着你应该能够通过 http://localhost:<local-port>
访问你的网站。
- 现在,你的网站已经成功构建并打包在一个容器中,你可以将其部署到云服务提供商。例如,查看 Google Cloud 部署指南和 Docker 文档中的 部署你的应用 页面。
更多方案
-
状态共享
学习如何使用 Nano Stores 在框架组件之间共享状态
-
添加 RSS 摘要
通过向你的 Astro 网站添加 RSS 摘要让用户来订阅你的内容。
-
Installing a Vite or Rollup plugin
Learn how you can import YAML data by adding a Rollup plugin to your project.
-
使用 API 路由构建表单
了解如何使用 JavaScript 发送表单到 API 路由
-
在 Astro 页面中构建 HTML 表单
了解如何在 Astro 页面中构建 HTML 表单并在你的 frontmatter 中处理提交请求
-
使用 Bun 和 Astro
学习如何在 Astro 网站上使用 Bun。
-
调用服务器端点
了解如何在 Astro 中调用服务器端点
-
校验验证码
了解如何创建一个 API 路由并从客户端进行获取。
-
用 Docker 来构建你的 Astro 网站
了解如何使用 Docker 来构建你的 Astro 网站。
-
为链接添加图标
了解如何安装 rehype 插件并为你 Markdown 文件中的链接添加图标
-
添加 i18n 功能
通过动态路由和内容集合来让你的 Astro 站点支持国际化。
-
Add Last Modified Time
Build a remark plugin to add the last modified time to your Markdown and MDX.
-
添加阅读时间
构建一个 remark 插件并将其添加到你的 Markdown 或 MDX 文件中。
-
在 Astro 组件中共享状态
了解如何通过 Nano Stores 在 Astro 组件中共享状态