#php #laravel #docker #dockerfile
Вопрос:
У меня есть контейнер docker, для которого мне нужно выполнить следующую команду
php /var/www/html/artisan queue:work amp;
Он запускает рабочий процесс, который ищет задания и выполняет их.
Я могу запустить его, выполнив exec-it, когда контейнер запущен.
Но мне нужно сделать это с помощью Dockerfile, чтобы при повторном развертывании мой контейнер запускался автоматически. Я пытался
RUN php /var/www/html/artisan queue:work
CMD ["php","/var/www/html/artisan","queue:work"]
ENTRYPOINT ["php","/var/www/html/artisan","queue:work"]
отдельно, конечно. но ни один из них не работает. В случае CMD и ТОЧКИ ВХОДА мой контейнер начинает выдавать ошибку 502, и моя служба становится недоступной.
Что я делаю не так?
Комментарии:
1. просмотр журналов,
docker logs <container_name>
безусловно, поможет нам понять, почему контейнер не запускается.2. Попробуйте выполнить команду таким образом:
CMD ["/bin/bash","-c","php","/var/www/html/artisan","queue:work amp;amp; tail -f /dev/null"]
3. Вы пытаетесь запустить работника в том же контейнере, что и что-то другое? Обычно вы запускаете только один процесс на контейнер; используйте второй контейнер (основанный на том же изображении, но с другой командой) для запуска рабочего.
4. Да, я хочу сделать и то, и другое в одном контейнере..
Ответ №1:
Вы можете сделать это несколькими способами.
Вы могли бы написать сценарий оболочки, который сначала запускает фоновый процесс, а затем запускает ваш API.
CMD ["./start_server.sh"]
Содержание ./start_server.sh
#!/bin/bash
php /var/www/html/artisan queue:work amp;
exec php-server-serving-api
Вы также можете сделать это с помощью сценария оболочки docker entrypoint
ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["php-server-serving-api"]
Содержание ./docker-entrypoint.sh
#!/bin/bash
php /var/www/html/artisan queue:work amp;
exec $@
Однако я рекомендую, если это отдельные типы рабочих нагрузок, запускать их в отдельном контейнере. Если задача фоновой обработки завершится сбоем, перезапустить ее будет некому. Если вы запустите его как отдельный контейнер, вы можете использовать систему для его перезапуска.
Комментарии:
1. что касается их запуска в отдельных контроллерах..можно ли это сделать с помощью одного и того же файла docker?
2. Да, возможно с тем же файлом docker. Создайте образ. При запуске контейнера передайте разные аргументы для запуска. Например
docker run image ./start-server.sh
, иdocker run image./start-worker.sh
при условии, что оба сценария скопированы в файле dockerfile в образ, чтобы он знал, как запустить api и рабочий