在Docker容器中安装新的节点依赖项

时间:2018-09-09 18:16:37

标签: node.js docker npm docker-compose

考虑使用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无法正常工作。有什么办法可以从容器中运行它?

编辑:我可以在容器外部运行某些“单一代码”来安装模块吗?

3 个答案:

答案 0 :(得分:2)

假设您不想编辑Dockerfile,则始终可以使用-it标志在正在运行的容器上执行命令:

$ docker run -it <container name> /usr/bin/npm install my_moduel

答案 1 :(得分:0)

首次访问容器内部:

$ docker exec -it <container name> /bin/bash

然后在容器内:

$ npm install pm2 -g

答案 2 :(得分:0)

你要么

  • a)想要全局安装pm2,您需要以root用户身份运行,因此请将您的安装放在<!doctype html> <html> <head> <meta charset="utf-8"> <title>preview photo</title> </head> <body> <form> <input type="file" onChange="preview_2(this);"><br> <img id="imagenFondo" style="height: 300px;width: 300px;"> </form> </body> </html>之前,以便您以默认用户(root)身份运行,或者
  • b)您只想安装pm2以在您的项目中使用,在这种情况下,只需删除USER node标志(告诉npm进行全局安装),它就会在您的项目-g中,您可以使用node_modulesnpx pm2来运行它,也可以从node_modules/.bin/pm2中以编程方式运行它(对于后者,我建议将其添加到您的index.js中,而无需在全部)。