Докер, выполняющий команду при запуске контейнера

#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 и рабочий