docker 部署 Gatsby 应用

docker 部署 Gatsby 应用

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

作者因Gatsby构建频繁失败,决定将其Docker化。文章详述了制作镜像流程:使用gatsbyjs/gatsby:onbuild基础镜像,创建Dockerfile和.dockerignore,构建后生成约14MB镜像;通过docker-compose配置运行,优化nginx设置;最后上传至Docker Hub,在服务器上拉取运行,更新时用docker-compose up -d即可无缝切换,避免重复安装构建的麻烦。

🔎

延伸解读

构建依赖的痛点

文章指出,Gatsby 项目在构建时经常因依赖下载或编译失败而中断,尤其是与图片处理相关的插件,如 gatsby-transformer-sharp、gatsby-plugin-sharp 和 gatsby-image。这些插件依赖的二进制包(如 pngquant-bin、mozjpeg)在国内网络环境下容易下载失败,或需要额外的编译工具,导致构建过程耗时且不稳定。作者通过 Docker 化将构建环境固化,避免了重复踩坑。

镜像体积与构建效率

作者使用 gatsbyjs/gatsby:onbuild 基础镜像,该镜像基于 Alpine Linux,体积仅 4.4MB,最终生成的网站镜像也只有 14.2MB。构建过程只需两三分钟,相比本地反复安装依赖和编译,效率显著提升。这得益于 Alpine 的轻量特性以及 Docker 层缓存机制,使得镜像构建快速且可重复。

docker-compose 的优势

作者对比了 docker run 命令和 docker-compose 的用法,指出 docker-compose 通过 YAML 文件配置,结构清晰、易于扩展,且支持自动清理容器。更重要的是,更新镜像时 docker-compose up -d 可以无缝切换,无需停止旧容器,避免了网站更新时的访问中断。这对于需要频繁更新的博客或网站来说,是一个重要的运维优势。

Q&A

为什么作者决定将 Gatsby 项目 Docker 化?

因为 Gatsby 及其插件在构建时经常失败,尤其是与图片相关的插件(如 gatsby-transformer-sharp、gatsby-plugin-sharp、gatsby-image)依赖的模块下载或编译容易出问题,解决起来耗时。作者担心以后更换系统或服务器时还要重复安装构建的麻烦,所以决定 Docker 化。

Gatsby 官方 Docker 镜像的 onbuild 标签有什么作用?

onbuild 标签的镜像会自动构建 Gatsby 项目并生成一个新的 Docker 镜像,而 latest 标签只会启动一个 nginx 服务来提供静态文件,需要手动将 public 目录拷贝进去。

在 Dockerfile 中应该使用哪个基础镜像?

使用 gatsbyjs/gatsby:onbuild 作为基础镜像。

构建 Gatsby 镜像时,.dockerignore 文件应该包含哪些内容?

应该包含 .cache/ 和 node_modules/,但不要添加 public/,因为 public 目录是构建生成的静态资源目录。

如何优化 Gatsby 镜像的 nginx 配置?

有两种方式:一是修改 Dockerfile,使用自定义的 nginx 配置文件,例如 COPY nginx-server-rules.conf /etc/nginx/server.conf;二是通过 docker run 命令的 --env-file 传参,例如 docker run --rm -e CACHE_IGNORE=html -p 80:80 albertaz.com。

为什么作者选择使用 docker-compose 而不是 docker run 命令?

因为 docker-compose 可以通过 YAML 配置文件来管理容器,结构清晰、易读,且便于扩展多个容器。此外,docker-compose 在更新镜像时可以无缝切换,无需停止正在运行的容器,避免网站更新时出现无法访问的情况。

如何将本地镜像上传到 Docker Hub?

首先需要注册 Docker Hub 账号,然后使用 docker tag 命令将本地镜像关联到 Docker Hub 仓库,例如 docker tag albertaz.com:latest albertaz/albertaz.com:latest,最后使用 docker push albertaz/albertaz.com 上传。

在服务器上运行 Gatsby 镜像的步骤是什么?

在服务器上安装 Docker 和 docker-compose,将 docker-compose.yml 文件上传到服务器,然后运行 docker-compose up -d,服务器会从 Docker Hub 拉取镜像并启动容器。

使用 docker-compose 更新 Gatsby 镜像时,如何避免网站中断?

直接运行 docker-compose up -d albertaz.com,docker-compose 会基于新镜像重新创建容器,无需停止旧容器,因此网站不会中断。

🏷️

标签

➡️

继续阅读