Gitflow 也未能创建 docker 图像

Gitflow failed too create docker image

大家好我在为 remix.run 应用程序创建 docker 图像并在 github 作业中使用它时遇到了一个奇怪的问题。

我有这个 Dockerfile

FROM node:16-alpine as deps


WORKDIR /app

ADD package.json  yarn.lock ./
RUN yarn install 


# Build the app
FROM node:16-alpine as build

ENV NODE_ENV=production

WORKDIR /app

COPY --from=deps /app/node_modules /app/node_modules

COPY . .
RUN yarn run build

# Build production image
FROM node:16-alpine as runner

ENV NODE_ENV=production
ENV PORT=80

WORKDIR /app

COPY --from=deps /app/node_modules /app/node_modules

COPY --from=build /app/build /app/build
COPY --from=build /app/public /app/public
COPY --from=build /app/api /app/api
COPY . .

EXPOSE 80
CMD ["npm", "run", "start"]

如果在我的本地机器上构建映像,一切正常,我可以 运行 容器并指向它。 我制作了一个 github 工作流构建相同的图像并将其推送到我的 docker 中心。

但是当 github 作业 运行s 它总是失败并出现此错误

Step 16/21 : COPY --from=build /app/build /app/build
COPY failed: stat app/build: file does not exist

我的 remix.run 配置是:

/**
 * @type {import('@remix-run/dev/config').AppConfig}
 */
module.exports = {
  appDirectory: "app",
  assetsBuildDirectory: "public/build",
  publicPath: "/build/",
  serverBuildDirectory: "api/_build",
  devServerPort: 8002,
  ignoredRouteFiles: [".*"],
};

在此先感谢您的帮助

您正在使用配置选项 serverBuildDirectory: "api/_build",因此当您 运行 重新混合构建时,您的服务器构建文件位于 api/_build/ 而不是 build/ 目录中。

在您的 docker 映像中,在最后阶段,您尝试从名为 build 的前一阶段复制 build/ 目录的内容。但是那里不存在该目录。服务器内容内置于 api/_build/ 中。

所以你不需要那行:

COPY --from=build /app/build /app/build

我认为它在本地适合您的一个可能原因是:

  1. 您有一个名为 build/ 的本地目录,其中包含用于服务器文件的本地构建。可能是因为您在更改 serverBuildDirectory 选项之前构建了它。它可能在您的 git 存储库中被忽略了。
  2. 构建 docker 映像时,名为 build 的阶段会复制 从你的本地目录到它自己的环境的一切 COPY . .,因此它会获取您的本地 build/ 目录。
  3. 然后在最后阶段将该目录复制到最终环境 COPY --from=build /app/build /app/build
  4. 当您在 git 集线器操作等新环境中执行相同操作时,build/ 目录在 运行 的 docker 环境中不存在命令,因此它不会从一个阶段复制到另一个阶段。你最终在尝试复制不存在的内容时遇到错误。

这个神器复制可能不是你想要的。如果您在 docker 映像中进行构建,您不希望还从本地环境中复制它。

为避免这些不需要的副本,您可以添加一个 .dockerignore 文件,其中至少包含以下内容:

node_modules
build
api/_build
public/build