运行 在 docker-compose 构建过程中构建 webpack

Run webpack build during docker-compose build process

我正在尝试使用缩小版的 js 文件构建生产 docker 容器。

在我的 Dockerfile 中,安装 npm 包后,我正在尝试构建 webpack 编译。

RUN npm install -g n  # upgrading the npm version
RUN n stable
ADD ./webpack/package.json /package.json
RUN npm install --production
RUN npm run build-production  # <<< Fails here

docker 构建过程将在最后一个命令 RUN npm run build-production 期间失败,npm 会抱怨找不到已安装的包(NODE_PATH 已设置)。

但是,当我将调用 npm run build-production 添加到我的 ENTRYPOINT 脚本时,它工作正常并按预期编译所有内容。但是,它运行 webpack 构建我启动容器的所有内容,这是不希望的。

为什么最后的 docker 构建步骤找不到前面步骤中安装的包?但为什么它通过入口点脚本工作?

将 webpack 构建添加到我的 Dockerfile 中的 docker 构建的最佳方法是什么?

请使用

RUN bash -l -c 'npm run build-production'

而不是你的

RUN npm run build-production  # <<< Fails here

这应该有帮助

问题可能是 build-production 需要一个 devDependencies,但尚未安装。

保持生产图像较小的一个好方法是使用像 dobi 这样的工具。它使得在开发容器中 运行 构建任务变得容易,然后将所有内容打包到生产映像中,所有这些都只需一个命令。

下面是一个可能适合您的示例dobi.yaml

meta:
  project: some-project-name

image=builder:
  image: myproject-dev
  context: dockerfiles/
  dockerfile: Dockerfile.build

image=production:
  image: user/prod-image-name
  context: .
  depends: [build]

mount=source:
  bind: .
  path: /code

run=build:
  use: builder
  mounts: [source]
  command: "npm run build-production"
  artifact: path/to/minified/assets

运行 dobi production 将 运行 任何过时的任务。如果 none 个源文件已更改,则跳过任务。 depends: [build] 确保构建步骤总是 运行 首先。