跳过正文
  1. 文章/

Docker运行 Strapi5官方中文指南

·3 分钟
 Author
文森的科技小站
目录

在 Docker 中运行 Strapi 5 — 完整中文指南
#

概览
#

本指南介绍如何使用 Docker 容器运行已有的 Strapi 5 项目。包含开发/暂存(development/staging)与生产(production)两类示例 Dockerfile、docker-compose 示例(支持 MySQL / MariaDB / PostgreSQL)、必要的环境变量说明、构建与发布镜像的常见命令,以及推荐的社区工具。

注意:Strapi 官方不维护任何通用的容器镜像。以下示例为社区实践示范,仅作参考。如有疑问请到 Strapi 社区 Discord 提问。

警告:Strapi 应用不应连接到非由 Strapi 创建的现有数据库,也不应直接连接到 Strapi v3 的数据库。这样做可能导致数据丢失(例如表被删除),Strapi 团队对这种不受支持的连接不提供支持。

先决条件
#

  • 已安装 Docker:https://www.docker.com/
  • 支持的 Node.js 版本(参见 Strapi 文档)
  • 一个已存在的 Strapi 5 项目,或使用 Quick Start 新建项目
  • (可选)Yarn
  • (可选)Docker Compose

必需的环境变量
#

下面这些环境变量是运行 Strapi 容器时通常需要设置的:

变量名说明
NODE_ENV应用运行环境(development / production)
DATABASE_CLIENT使用的数据库客户端(mysql / postgres / mariadb 等)
DATABASE_HOST数据库主机
DATABASE_PORT数据库端口
DATABASE_NAME数据库名称
DATABASE_USERNAME数据库用户名
DATABASE_PASSWORD数据库密码
JWT_SECRETUsers-Permissions 插件签名 JWT 的密钥
ADMIN_JWT_SECRETAdmin 面板 JWT 签名密钥
APP_KEYS用于签名 session cookies 的密钥列表

还可以设置其他可选环境变量,详见 Strapi 环境配置文档。


开发 / 暂存 环境
#

在本地或暂存环境下,你可以使用一个较简单的 Dockerfile 来构建非生产镜像;若需要数据库也可用 docker-compose 启动数据库容器。

提示:如果使用 docker-compose,可以在 compose 文件或 .env 中定义环境变量,无需手动传入。

开发 Dockerfile(npm 示例)
#

文件:./Dockerfile

FROM node:22-alpine

# 安装 libvips 及构建依赖(用于 sharp)
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev nasm bash vips-dev git

ARG NODE_ENV=development
ENV NODE_ENV=${NODE_ENV}

WORKDIR /opt/
COPY package.json package-lock.json ./

RUN npm install -g node-gyp
RUN npm config set fetch-retry-maxtimeout 600000 -g && npm install

ENV PATH=/opt/node_modules/.bin:$PATH
WORKDIR /opt/app
COPY . .
RUN chown -R node:node /opt/app
USER node
RUN ["npm", "run", "build"]
EXPOSE 1337
CMD ["npm", "run", "develop"]

可选:docker-compose(带数据库)
#

下面给出三种常见数据库的 docker-compose 示例。所有示例都将 Strapi 服务命名为 strapi,数据库服务命名为 strapiDB,并使用一个共享 volume 保存数据库数据。

  • 使用 MySQL(示例)

文件:./docker-compose.yml

version: "3"
services:
  strapi:
    container_name: strapi
    build: .
    image: strapi:latest
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_CLIENT: ${DATABASE_CLIENT}
      DATABASE_HOST: strapiDB
      DATABASE_PORT: ${DATABASE_PORT}
      DATABASE_NAME: ${DATABASE_NAME}
      DATABASE_USERNAME: ${DATABASE_USERNAME}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      JWT_SECRET: ${JWT_SECRET}
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      APP_KEYS: ${APP_KEYS}
      NODE_ENV: ${NODE_ENV}
    volumes:
      - ./config:/opt/app/config
      - ./src:/opt/app/src
      - ./package.json:/opt/package.json
      - ./yarn.lock:/opt/yarn.lock
      - ./.env:/opt/app/.env
      - ./public/uploads:/opt/app/public/uploads
    ports:
      - "1337:1337"
    networks:
      - strapi
    depends_on:
      - strapiDB

  strapiDB:
    container_name: strapiDB
    platform: linux/amd64 # 针对 Apple M1 芯片平台问题
    restart: unless-stopped
    env_file: .env
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: ${DATABASE_USERNAME}
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_DATABASE: ${DATABASE_NAME}
    volumes:
      - strapi-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - strapi

volumes:
  strapi-data:

networks:
  strapi:
    name: strapi
    driver: bridge
  • 使用 MariaDB(示例)

只需将 strapiDB.image 改为 mariadb:latest,其余配置类似:

# 省略重复部分,参考 MySQL 示例,将 image: mysql:8.0 替换为 image: mariadb:latest
  • 使用 PostgreSQL(示例)
# 省略重复部分,数据库服务改为:
  strapiDB:
    container_name: strapiDB
    platform: linux/amd64
    restart: unless-stopped
    env_file: .env
    image: postgres:16.0-alpine
    environment:
      POSTGRES_USER: ${DATABASE_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
    volumes:
      - strapi-data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"
    networks:
      - strapi

提示:若在 Apple M1/M2(ARM) 芯片上遇到镜像平台相关错误,可指定 platform: linux/amd64(性能会受影响)。


生产环境
#

生产环境的 Docker 镜像与开发镜像不同,主要在于 Admin 面板的构建与运行命令(生产环境使用 strapi start)。生产镜像通常使用多阶段构建来减少最终镜像体积并生成已构建的 admin 面板。

生产 Dockerfile(npm 多阶段示例)
#

# 多阶段构建:build 阶段
FROM node:22-alpine AS build
RUN apk update && apk add --no-cache build-base gcc autoconf automake zlib-dev libpng-dev vips-dev git > /dev/null 2>&1
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /opt/
COPY package.json package-lock.json ./
RUN npm install -g node-gyp
RUN npm config set fetch-retry-maxtimeout 600000 -g && npm install --only=production
ENV PATH=/opt/node_modules/.bin:$PATH
WORKDIR /opt/app
COPY . .
RUN npm run build

# 生成最终的生产镜像
FROM node:22-alpine
RUN apk add --no-cache vips-dev
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /opt/
COPY --from=build /opt/node_modules ./node_modules
WORKDIR /opt/app
COPY --from=build /opt/app ./
ENV PATH=/opt/node_modules/.bin:$PATH
RUN chown -R node:node /opt/app
USER node
EXPOSE 1337
CMD ["npm", "run", "start"]

构建生产镜像
#

示例命令:

docker build \\
  --build-arg NODE_ENV=production \\
  -t mystrapiapp:latest \\
  -f Dockerfile.prod .

你可以根据需要传入更多的 build-args(例如 STRAPI_URL)或使用 Docker BuildKit 等高级选项。

(可选)将镜像推送到镜像仓库
#

生产环境建议使用私有镜像仓库以保护镜像中的敏感信息。常见的容器注册表包括:

  • AWS ECR
  • Azure Container Registry
  • GCP Container Registry / Artifact Registry
  • DigitalOcean Container Registry
  • GitHub Container Registry
  • GitLab Container Registry

推送镜像示例(以 DockerHub 为例):

docker tag mystrapiapp:latest myrepo/mystrapiapp:latest
docker push myrepo/mystrapiapp:latest

不同云厂商的推送命令与认证方式略有差异,请参照对应文档。


社区工具
#

Strapi 社区提供了一些工具来生成 Dockerfile 与自动部署:

  • @strapi-community/dockerize
    • 用法:在项目根目录运行 npx @strapi-community/dockerize@latest,按照提示生成 Dockerfile 与 docker-compose
    • 仓库:https://github.com/strapi-community/strapi-tool-dockerize

参考与链接
#

  • Strapi 文档(原文/英文):https://docs.strapi.io/
  • Docker 官方文档:https://docs.docker.com/
  • Docker Compose 文档:https://docs.docker.com/compose/

📖 阅读量: