GitLab构建Strapi镜像时Docker Compose报错:无效引用格式
问题分析与解决
错误原因
- ARG变量作用域问题:你在第一个
FROM strapi/base之后定义ARG NODE_VERSION=18.20.3,但Dockerfile中ARG的作用域仅从定义处开始到当前构建阶段结束。第二个FROM node:${NODE_VERSION}-alpine属于新的构建阶段,此时${NODE_VERSION}未被赋值,最终变成node:-alpine,触发无效镜像引用格式错误。 - 构建阶段引用错误:Dockerfile中最后
COPY --from=build /usr/src/app/.strapi ./.strapi里的build阶段不存在——你在deps阶段执行了yarn run build,但未将该阶段命名为build,导致后续无法引用。
修正后的Dockerfile
# syntax=docker/dockerfile:1 # 将ARG移到最顶部,确保所有构建阶段都能访问该变量 ARG NODE_VERSION=18.20.3 # 移除未被使用的strapi/base镜像引用,避免阶段混淆 # FROM strapi/base # 定义基础镜像阶段 FROM node:${NODE_VERSION}-alpine as base WORKDIR /usr/src/app # 安装生产依赖阶段 FROM base as deps RUN --mount=type=bind,source=package.json,target=package.json \ --mount=type=bind,source=yarn.lock,target=yarn.lock \ --mount=type=cache,target=/root/.yarn \ yarn install --production --frozen-lockfile # 构建应用阶段 FROM base as build RUN --mount=type=bind,source=package.json,target=package.json \ --mount=type=bind,source=yarn.lock,target=yarn.lock \ --mount=type=cache,target=/root/.yarn \ yarn install --frozen-lockfile COPY . . RUN yarn run build # 最终镜像阶段 FROM base as final ENV NODE_ENV production USER node COPY package.json . # 从正确阶段复制依赖与构建产物 COPY --from=deps /usr/src/app/node_modules ./node_modules COPY --from=build /usr/src/app/.strapi ./.strapi EXPOSE 1337 CMD yarn start
额外说明
- 拆分
deps和build阶段,符合多阶段构建最佳实践,可有效减少最终镜像体积。 - 移除无用的
strapi/base镜像引用,避免不必要的镜像拉取和资源浪费。
内容的提问来源于stack exchange,提问作者Cinzia Nicoletti
相关产品推荐
相关产品推荐

