Запуск gulp в Docker compose - не создает файлы - PullRequest
0 голосов
/ 02 июля 2018

У меня есть проблемы, когда gulp не создает никаких файлов. Там написано, что файл завершен, но файл не создается. Если я войду в свой экземпляр докера, используя:

docker exec -t -i myservice-service / bin / bash и если я запускаю команду gulp, то она создает ее правильно

Затем создаются все файлы, определенные в gulpfile.js. Другими словами, public / dist / заполняется main.js и другими css-файлами.

Это мой Dockerfile.

FROM node:9

RUN mkdir -p /usr/src/app
RUN mkdir -p /usr/src/logs

WORKDIR /usr/src/app

# GULP Installation
RUN npm install -g gulp
RUN npm install gulp

COPY package*.json /usr/src/app/
COPY .npmrc /usr/src/app/

RUN cd /usr/src/app/ && npm install && npm install -g nodemon

COPY . /usr/src/app
RUN chown -R node:node /usr/src/app && chown -R node:node /usr/src/logs

USER node

EXPOSE 3000
RUN gulp

CMD ["npm", "run-script", "start" ]

А это мой файл композитора (разработка):

version: "3"

services:
  myservice-service:
    build: .
    image: myservice-service
    container_name: myservice-service
    volumes:
        - .:/usr/src/app
        - /usr/src/app/node_modules
    environment:
      - NODE_ENV=dev
    ports:
      - 3000:3000
    command: nodemon --delay 2 ./bin/www

Я запускаю его как:

docker-compose -f docker-compose.development.yml up --build

Когда я запускаю его таким образом, он не создает никаких файлов. Я получаю тот же вывод на экране, когда запускаю команду вручную.

Я часами пытался заставить его работать, я пытался с настройкой разрешений, а что нет, но он просто не работает.

Я ожидал, что public / dist / заполнится файлами.

Любая помощь приветствуется.

UPDATE. Это работает, но у меня есть сомнения:

Мне удается заставить его работать, используя команду внутри самого composerfile. Итак, в моем случае:

команда: bash -c "gulp && nodemon --delay 2 ./bin/www"

По моему мнению, gulp должен выполняться внутри самого Dockerfile, а не в файлах композитора. Но опять же, это выходит за рамки моих знаний.

1 Ответ

0 голосов
/ 03 июля 2018

Dockerfile запускается во время сборки и копирует все файлы в вашем локальном каталоге в контейнер, затем запускает gulp и создает любые файлы.

Затем вы монтируете локальную папку поверх файловой системы контейнеров докера, в значительной степени перезаписывая то, что было сделано в файле докера с оригинальными файлами, поскольку gulp выполнял файлы в контейнере, это не влияло на исходные файлы, поэтому вы отменяет изменения.

Решения заключаются либо в том, чтобы сделать то, что вы упомянули в своем вопросе (добавьте его в command в docker-compose.yml или запустить через docker-compose exec), либо написать собственный скрипт точки входа, который будет запускать gulp, а затем команда, что-то вроде:

бен / entrypoint.sh

#!/bin/sh
gulp
exec "$@"

Dockerfile

FROM node:9

COPY bin/entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh

RUN mkdir -p /usr/src/app
RUN mkdir -p /usr/src/logs

WORKDIR /usr/src/app

# GULP Installation
RUN npm install -g gulp
RUN npm install gulp

COPY package*.json /usr/src/app/
COPY .npmrc /usr/src/app/

RUN cd /usr/src/app/ && npm install && npm install -g nodemon

COPY . /usr/src/app
RUN chown -R node:node /usr/src/app && chown -R node:node /usr/src/logs

USER node

EXPOSE 3000

ENTRYPOINT ["/entrypoint.sh"]

CMD ["npm", "run-script", "start" ]

Это сделает вашу сборку немного менее предсказуемой, поскольку она будет запускаться gulp каждый раз, когда запускается контейнер (например, после каждого развертывания), если вы используете один и тот же Dockerfile в dev и production.

...