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
我认为它在本地适合您的一个可能原因是:
- 您有一个名为
build/
的本地目录,其中包含用于服务器文件的本地构建。可能是因为您在更改 serverBuildDirectory
选项之前构建了它。它可能在您的 git 存储库中被忽略了。
- 构建 docker 映像时,名为
build
的阶段会复制
从你的本地目录到它自己的环境的一切
COPY . .
,因此它会获取您的本地 build/
目录。
- 然后在最后阶段将该目录复制到最终环境
COPY --from=build /app/build /app/build
。
- 当您在 git 集线器操作等新环境中执行相同操作时,
build/
目录在 运行 的 docker 环境中不存在命令,因此它不会从一个阶段复制到另一个阶段。你最终在尝试复制不存在的内容时遇到错误。
这个神器复制可能不是你想要的。如果您在 docker 映像中进行构建,您不希望还从本地环境中复制它。
为避免这些不需要的副本,您可以添加一个 .dockerignore
文件,其中至少包含以下内容:
node_modules
build
api/_build
public/build
大家好我在为 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
我认为它在本地适合您的一个可能原因是:
- 您有一个名为
build/
的本地目录,其中包含用于服务器文件的本地构建。可能是因为您在更改serverBuildDirectory
选项之前构建了它。它可能在您的 git 存储库中被忽略了。 - 构建 docker 映像时,名为
build
的阶段会复制 从你的本地目录到它自己的环境的一切COPY . .
,因此它会获取您的本地build/
目录。 - 然后在最后阶段将该目录复制到最终环境
COPY --from=build /app/build /app/build
。 - 当您在 git 集线器操作等新环境中执行相同操作时,
build/
目录在 运行 的 docker 环境中不存在命令,因此它不会从一个阶段复制到另一个阶段。你最终在尝试复制不存在的内容时遇到错误。
这个神器复制可能不是你想要的。如果您在 docker 映像中进行构建,您不希望还从本地环境中复制它。
为避免这些不需要的副本,您可以添加一个 .dockerignore
文件,其中至少包含以下内容:
node_modules
build
api/_build
public/build