#javascript #docker #npm #reload #svelte
#язык JavaScript #докер #нпм #перезагрузить #стройная
Вопрос:
Я боролся с ситуацией в течение последнего дня, и я действительно не мог найти ничего, что помогло бы мне ее решить:
У меня есть проект Svelte Flask, который я некоторое время запускал непосредственно на своем хосте, но недавно я решил закрепить как внешний, так и внутренний сервис в одном контейнере.
Теперь, при разработке интерфейсной части, я npm run dev
запускал службу интерфейса и перезагружал ее каждый раз, когда вносил изменения в код. Проблема в том, что когда я запускаю то же самое внутри контейнера, при обновлении кода ничего не происходит. Я точно знаю, что код, который я пишу на хосте, помещается в контейнер с использованием тома, определенного в docker-compose.
Честно говоря, я довольно новичок в контейнеризации в целом, поэтому не удивлюсь, если это то, что я пропустил.
Для справки, вот мой файл Dockerfile:
FROM nikolaik/python-nodejs:python3.9-nodejs16-slim WORKDIR /opt/myproject COPY . . RUN pip3 install -r server/requirements.txt RUN cd client amp;amp; npm install amp;amp; npm run-script build EXPOSE 5000 ENV FLASK_ENV="development" ENV FLASK_APP="/opt/myproject/server/src/start.py" CMD ["/bin/sh", "/opt/myproject/start_services.sh"]
Я создал сценарий для запуска обоих Gunicorn на бэкэнде в дополнение к npm run dev:
#!/bin/sh cd /opt/myproject/server/src gunicorn --bind 0.0.0.0:5000 --reload --daemon start:app cd /opt/myproject/client npm run dev
Вот мое сочинение, если оно также необходимо:
# docker-compose.yml version: '3.9' services: web: image: myproject_main container_name: myproject_main_container ports: - "5000:5000" dns: - 8.8.8.8 volumes: - ./myproject_code:/opt/myproject networks: default: external: true name: myproject_net
Большое спасибо!
Комментарии:
1. на самом деле это не ваша проблема, но вам, вероятно, не следует помещать свой интерфейс и колбу в один контейнер. Для разработки используйте образ узла или разрабатывайте локально, а для prod поместите статику, например, в образ nginx.
2. У меня нет ответа на ваш вопрос, но я хотел бы отметить, что docker предназначен для наилучшего воспроизведения вашей производственной среды. Это означает, что это не самый подходящий инструмент для отладки вашего приложения. Я бы рекомендовал протестировать обе стороны приложения локально. Затем, когда оба будут надежными, запустите контейнер и посмотрите, ведет ли приложение себя так, как ожидалось. Разверните образ в своей среде. Я думаю, то, о чем вы просите, можно сделать. Я никогда не видел, чтобы это делалось.
3. Должен быть честен с вами, вы, вероятно, правы, но сейчас это в основном мой опыт обучения, так что я как бы срезаю углы
4. Вы открываете только один порт. Как сделать отступ, чтобы увидеть интерфейс во время его горячей перезагрузки? Мне кажется, что вы создали статику один раз во время создания изображения и позволили колбе обслуживать их. Таким образом, flask не увидит, что делает ваш стройный сервер разработчиков, если только он не скомпилирует проект в статику и не поместит их в статику колб.
5. @TheFool У меня есть колба, работающая на 5000, и npm использует случайный порт, так как занято 5000, но AFAIK npm сам перестраивает страницы, когда он работает, независимо от того, что видит Колба, и Колба просто ссылается на встроенные страницы. Я действительно не полагаюсь на Flask для перезагрузки всякий раз, когда обнаруживаются изменения интерфейса