Назад | Перейти на главную страницу

Совместное использование двоичного файла node_modules между контейнерами в docker-compose

Я хотел бы запустить двоичный файл npm в контейнере, который был установлен другим контейнером.

Я понимаю, что можно использовать общий том.

У меня такая конфигурация:

docker-compose.yml

version: '3'
services:
  cypress:
    build:
      context: .
      dockerfile: Dockerfile-cypress
    volumes:
      - ./node_modules:/app/node_modules
  test:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - cypress
    environment:
      - ENV=development
    volumes:
      - ./node_modules:/app/node_modules

Dockerfile-кипарис

FROM cypress/base:10

WORKDIR /app

COPY . /app

RUN npm install uuid
RUN $(npm bin)/uuid

Dockerfile

FROM node:10.13

COPY . /app

WORKDIR /app

RUN $(npm bin)/uuid

При беге docker-compose build это не удается, потому что:

Step 5/5 : RUN $(npm bin)/uuid
 ---> Running in 1d86293ea47c
/bin/sh: 1: /app/node_modules/.bin/uuid: not found
ERROR: Service 'test' failed to build: The command '/bin/sh -c $(npm bin)/uuid' returned a non-zero code: 127

Что не так в моей конфигурации, что том не доступен во втором контейнере?

Тома используются совместно только во время выполнения, а не во время сборки.

Каждые БЕГАТЬ инструкция работает во время сборки, на данный момент объемы недоступны.

Вы должны поместить эти инструкции в CMD или ВХОДНАЯ ТОЧКА инструкция. В этом случае, поскольку приложение простое, нам даже не нужны файлы докеров.

version: '3'
services:
  cypress:
    image: cypress/base:10
    volumes:
      - ./node_modules:/app/node_modules
    working_dir: /app
    command: /bin/sh -c 'npm install uuid && chown -R your_user_uid:your_group_uid /app && $$(npm bin)/uuid'

  test:
    image: node:10.13
    working_dir: /app
    environment:
      - ENV=development
    volumes:
      - ./node_modules:/app/node_modules
    command: /bin/sh -c '$$(npm bin)/uuid'

В этом случае лучше, если вы запустите тестовую команду после завершения выполнения cypres, потому что у вас нет возможности узнать, доступен ли уже двоичный файл, если вы запустите их одновременно.

Я рекомендую вам создать сценарий в bash, например:

docker_up.sh

docker-compose run cypress
docker-compose run test

Затем:

./docker_up.sh

НОТЫ:

chown -R your_user_uid:your_group_uid /app

Приведенный выше код важен, потому что у вас могут возникнуть проблемы с разрешениями при работе с общими томами. Бегать: echo $(id -u):$(id -g) чтобы получить ваши идентификаторы.