Я хотел бы запустить двоичный файл 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)
чтобы получить ваши идентификаторы.