Установить новую зависимость узла внутри контейнера Docker - PullRequest
0 голосов
/ 09 сентября 2018

Учитывая следующую среду разработки с 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 голосов
/ 10 сентября 2018

Первый доступ внутри контейнера:

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

Тогда внутри контейнера:

$ npm install pm2 -g
0 голосов
/ 10 сентября 2018

Вы либо

  • a) хотите установить pm2 глобально, который вам нужно запустить от имени пользователя root, поэтому поместите установку до USER node, чтобы вместо нее запустить пользователя по умолчанию (root), или
  • b) вы просто хотите установить pm2 для использования в вашем проекте, и в этом случае просто сбросьте флаг -g, который указывает npm установить глобально, и вместо этого он будет в вашем проекте node_modules, и вы можете запустить это с npx pm2 или node_modules/.bin/pm2, или программно с вашего index.js (для последнего я бы предложил добавить его к вашему package.json и вообще не устанавливать его вручную).
0 голосов
/ 09 сентября 2018

Если вы не хотите редактировать Dockerfile, вы всегда можете выполнить команду на работающем контейнере с флагом -it:

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