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

3

我正在尝试使用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

在最后一个命令RUN npm run build-production执行时,docker构建过程会失败,npm会抱怨找不到已安装的包(因为NODE_PATH被设置了)。
然而,当我将调用npm run build-production添加到我的ENTRYPOINT脚本中时,它可以正常工作并按预期编译所有内容。但是,每次启动容器时都会运行webpack构建,这不是所期望的。
为什么最后一个docker构建步骤无法找到之前步骤中安装的包?但是为什么通过entrypoint脚本可以工作?
在Dockerfile中,将webpack构建添加到docker构建的最佳方法是什么?

能否提供您所遇到的具体错误信息?可能是由于build-production的某个依赖项被列在了devDependencies下,因此找不到它?这是由于--production标志而没有安装?在运行时,您是否使用了卷(volume)? - dnephin
@dnephin感谢您的建议。所有软件包都包含在“--production”依赖项中。即使没有“--production”,我也会遇到相同的错误。是的,我正在使用卷。在构建期间不可访问吗? - neurix
不,卷在构建期间是无法访问的。 - dnephin
2个回答

3
请使用
RUN bash -l -c 'npm run build-production'

改为您的

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

this should help


0
问题可能是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 将运行任何过期的任务。 如果没有更改源文件,则跳过这些任务。 depends: [build] 确保构建步骤始终首先运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接