#node.js #docker #npm #docker-compose
#node.js #docker #npm #docker-compose
Вопрос:
Я бы хотел запустить 2 контейнера с помощью docker-compose. Один для базы данных и один для сервера узла с использованием node
образа по умолчанию на DockerHub. В контейнере узла я хотел бы смонтировать локальную папку, которая управляется исходным кодом как том. Я видел много примеров, когда создается Dockerfile, который копирует исходные файлы в образ, а затем RUN npm install
в Dockerfile используется команда. Но это приводит к созданию нового образа с исходными файлами в нем. В моем случае я не хочу сохранять файлы исходного кода в образе узла. Итак, я бы хотел entrypoint
, чтобы контейнер узла в моем файле docker-compose npm install
также выполнялся npm start
, но, похоже, я не могу заставить эту комбинацию работать. Вот мой docker-compose.yml
:
version: "3.8"
services:
server:
container_name: my_server
image: node:12.16.1
ports:
- "8000:8000"
volumes:
- ../my-server-files-source-controlled:/var/www
working_dir: /var/www
entrypoint: ["npm", "start"]
networks:
- my-network
db:
container_name: my_database
image: postgres
environment:
{ommitted}
ports:
- "5432:5432"
networks:
- my-network
networks:
my-network:
driver: bridge
Приведенная выше команда работает нормально, но когда я меняю entrypoint
значение «включить npm install
«, происходит сбой. Я пробовал следующие примеры, а также многие другие, и все они терпят неудачу:
entrypoint: ["npm", "install", "amp;amp;", "npm", "start"]
entrypoint: ["npm install", "npm start"]
entrypoint: "npm install amp;amp; npm start"
Похоже, у меня может быть npm install
или npm start
entrypoint
, но не оба. Как заставить обе эти команды работать в моем файле docker-compose?
Ответ №1:
Если вы хотите использовать несколько команд, вы можете сделать это с помощью bash -c "commands"
:
services:
myservice:
command: bash -c "npm install amp;amp; npm start"
Кстати, в производственном развертывании я бы предложил использовать npm ci
вместо npm install
. Также рассмотрите возможность использования флагов --only=prod
и --no-audit
(в зависимости от ваших настроек).
Комментарии:
1. Сработало как шарм, спасибо! Так что использовать
entrypoint
для одной команды иcommand
сложных? Я просто вхожу в docker и все еще пытаюсь понять все варианты. 😊2.
entrypoint:
иcommand:
объединяются вместе, чтобы сформировать единую команду. Обе части являются необязательными; обычно вы указываете их через строкиENTRYPOINT
илиCMD
в вашем Dockerfile, а не переопределяете их вdocker-compose.yml
файле.