考虑到Docker的以下开发环境:
# /.env
CONTAINER_PROJECT_PATH=/projects/my_project
# /docker-compose.yml
version: '2'
services:
web:
restart: always
build: ./docker/web
working_dir: ${CONTAINER_PROJECT_PATH}
ports:
- "3000:3000"
volumes:
- .:${CONTAINER_PROJECT_PATH}
- ./node_modules:${CONTAINER_PROJECT_PATH}/node_modules
# /docker/web/Dockerfile
FROM keymetrics/pm2:latest-alpine
FROM node:8.11.4
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
RUN mkdir -p /projects/my_project
RUN chown node:node /projects/my_project
# If you are going to change WORKDIR value,
# please also consider to change .env file
WORKDIR /projects/my_project
USER node
RUN npm install pm2 -g
CMD npm install && node /projects/my_project/src/index.js
如何在容器中安装新模块?由于npm install
属于node_module
用户,root
on host将无法正常工作。有没有办法从容器中运行它?
编辑:我是否可以在容器外运行安装模块的“单行”?
假设您不想编辑Dockerfile
,您始终可以使用-it
标志在正在运行的容器上执行命令:
$ docker run -it <container name> /usr/bin/npm install my_moduel
首先访问容器内部:
$ docker exec -it <container name> /bin/bash
然后在容器内:
$ npm install pm2 -g
你要么
USER node
之前安装你的安装,这样你就可以在默认用户(root)上运行,或者-g
标志,告诉npm全局安装,它将在你的项目node_modules
中,你可以用npx pm2
或node_modules/.bin/pm2
运行它,或者以编程方式从你的index.js
(对于后者我建议将它添加到你的package.json
而不是手动安装它)。