NodeJS не обнаруживает изменения в Docker Bind Mount, пока Swarm не будет перезапущен - PullRequest
1 голос
/ 16 октября 2019

Я создаю приложение NodeJS на Docker в режиме Swarm (один узел). Я использую том для подключения к исходному коду NodeJS. Все работает отлично, и я вижу вывод в localhost из NodeJS и Express, но когда я что-то изменяю в коде NodeJS (который находится в томе монтирования bind), ничего не меняется. Я должен перезапустить свой сервис, чтобы наблюдать за изменениями. Раньше, когда я работал только с Docker Compose, этого никогда не происходило, но теперь, когда я переключился на Swarm, у меня возникают проблемы.

Я использую Docker 18 с Visual Studio Code 1.39 в macOS 10.14. 6

Dockerfile

FROM node:12-alpine
WORKDIR /node-dir
COPY package*.json ./
RUN npm install

docker-compose.yml file

# Docker-compose.yml
version: '3.7'

services:

    node-service:

        image: node-img:1.0

        ports:
            - 80:3000
        working_dir: "/node-dir"

        volumes:
        - ./node-dir/source:/node-dir/source

        networks:
            - ness-net

        command: npm start

networks:

    ness-net:

Я также читал, что это может быть связано с inode, большинство редакторов при сохранении файлаломает ссылку. Но он работал правильно в docker-compose с кодом Visual Studio, его поведение изменилось только в Docker Swarm.

Обновление: я обработал статический html-файл, используя Nginx с bind mount, и я легко могу изменить этот файлиспользуя VS Code и это отражается. Это единственный NodeJS, который не обнаруживает изменения в файле.

1 Ответ

1 голос
/ 23 октября 2019

Если ваше сопоставление тома правильное, изменения исходного кода должны поступить в ваш контейнер приложения node.js.

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

В данный момент я нахожусь в режиме разработки, и мне приходится неоднократно тестировать исходный код, поэтому я хочу использовать bind mounts, чтобы упростить разработку и тестирование.

Однакоизменение исходного кода будет неэффективным до тех пор, пока процесс узла внутри контейнера не перезагрузится и не соберет изменения.

Чтобы достичь этого, вам нужно использовать nodemon . Nodemon выберет изменения в исходном коде и перезагрузит процесс узла вместе с изменениями.

Другая, более длинная альтернатива - это создание нового образа докера, а затем обновление приложения с использованием: docker service update --image=...

...