0

大家好,我在为 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 hub 上。

但是当 github 作业运行时,它总是会因为这个错误而失败

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: [".*"],
};

提前感谢您的帮助

4

1 回答 1

1

您正在使用 config option serverBuildDirectory: "api/_build",因此当您运行 remix 构建时,您的服务器构建文件在目录中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. 当您在 github 操作之类的新环境中执行相同操作时,build/运行 docker 命令的环境中不存在该目录,因此它不会从一个阶段复制到另一个阶段。最后,您在尝试复制不存在的内容时遇到错误。

这种工件复制可能不是您想要的。如果您在 docker 映像中进行构建,您也不想从本地环境中复制它。

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

node_modules
build
api/_build
public/build
于 2022-02-17T16:11:03.863 回答