docker-compose установка npm и запуск npm в точке входа

#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 файле.