记录一次 docker 部署前端应用 npm 的问题

最近在部署一个较为复杂的 web 应用,其中涉及到 mongodb redis php node cron。为了简化部署,想到了使用 docker 部署。

使用 node 时,可以使用 node 的官方 image

其 docker-compose.yaml 可以如下配置

1
2
3
4
5
6
7
8
9
10
11
12
version: "2"
services:
node-build:
image: "node:8"
container_name: "test-node"
working_dir: /home/node/app
environment:
- NODE_ENV=production
volumes:
- ./:/home/node/app
command: >
bash -c "npm install && npm run build"

发现,安装好了之后,不能执行 build。是因为 build 中引入了 webpack,而 webpack 是在 devDependencies 中定义的。

比较奇怪的是,在 自己的开发机 上是可以直接 npm install 安装 webpack,在 docker 容器中不可以。

初步怀疑是 images 搭载的操作系统问题。最后换了个镜像,依然不行。

最后发现,是 npm config 的问题。

执行

1
2
3
4
5
6
7
➜  ~ npm config ls -l | grep pro
https-proxy = null
noproxy = null
production = false
progress = true
proxy = null
save-prod = false

我们看到 production=false,在这种模式下,npm install 就会安装 devDependencies ,而 docker 容器中执行 npm config ls -l | grep pro
后发现, production=true。这就是问题所在。

更新 docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
version: "2"
services:
node-build:
image: "node:8"
container_name: "test-node"
working_dir: /home/node/app
environment:
- NODE_ENV=development
volumes:
- ./:/home/node/app
command: >
bash -c "npm install && npm run build"

修改 NODE_ENV 为 development 即可。


虽然看起来是很小的问题,确着实花了好长时间去排错调试。特此记录!

参考资料: