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

问题描述 投票:2回答:3

考虑到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将无法正常工作。有没有办法从容器中运行它?

编辑:我是否可以在容器外运行安装模块的“单行”?

node.js docker npm docker-compose
3个回答
2
投票

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

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

0
投票

首先访问容器内部:

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

然后在容器内:

$ npm install pm2 -g

0
投票

你要么

  • a)想要全局安装pm2,你需要以root用户身份运行,所以在USER node之前安装你的安装,这样你就可以在默认用户(root)上运行,或者
  • b)你只想安装pm2在你的项目中使用,在这种情况下只需要删除-g标志,告诉npm全局安装,它将在你的项目node_modules中,你可以用npx pm2node_modules/.bin/pm2运行它,或者以编程方式从你的index.js(对于后者我建议将它添加到你的package.json而不是手动安装它)。
© www.soinside.com 2019 - 2024. All rights reserved.