docker: как стартовать nginx и оставить контейнер работать?
Господа,
по неким причинам, котрые выходят за рамки этого вопроса, я собираю свой контейнейр для запуска nginx.
Начал я с простого. я написал Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nginx
EXPOSE 80 443
и после docker build -t my_nginx .
получил образ. Чтобы контейнер не завершился сразу после запуска, я запускал его командой docker run --name nginx_1 -p 1080:80 -d my_nginx sh -c "sleep infinity"
Но... так как в контейнере никто не нписал команду service nginx start - то nginx был остановлен. Если я заходил в контейнер командой docker exec и вручную запускал его - все работало, но это как то неправильно.
Чего я после этого только не пробовал делать
И так:
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nginx
EXPOSE 80 443
RUN service nginx start
И так:
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nginx
EXPOSE 80 443
CMD service nginx start
-не помогает.
Я даже пытался вкоманду service nginx start в sh - файл, закинуть его в контейнейр командой COPY и выполнить, но всё равно - контейнейр запускаается, а сервис nginx в нём остановлен.
Как бы эту проблему решить? Хорошо бы еще и от уродливого sh -c "sleep infinity" в конце команды docker run избавиться, если у кого то уже есть опыт.
Спасибо за советы заранее!
PS. И не могли бы Вы в нескольких словах объяснить, почему те два способа запуска (последне команды в приведенных мной Dockerfile), котрые я попробовал, не срабатывают?
Ответы (2 шт):
service не нужен. В нашем случае сервисом для ОС является сам докер-демон.
RUN работает на этапе сборки образа.
Нужно CMD ["nginx","-g","daemon off;"].
Как я узнал? Сделал docker pull nginx, docker history nginx --no-trunc -- история сборки официального образа.
Вместо этого daemon off; можно писать и в конфиг самого nginx.
Без daemon off; процесс запуска nginx будет сразу возвращать управление запускаючему (докеру), и он решит, что контейнер отработал.
[" нужны, чтоб не делать лишний шелл процесс.
Например:
Dockerfile
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y nginx
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
docker-compose.yml
services:
nginx:
image: nginx-test
ports:
- "127.0.0.9:80:80"
- "127.0.0.9:443:443"
version: '2'
docker build -t nginx-test .
docker-compose up -d
Была такая же проблема, решил так:
Создаем bash файл например с названием "init.sh":
#!/bin/sh
service nginx start
#тут еще любые команды, например запуск php-fpm
bash
В dockerfile пишем
COPY init.sh init.sh
ENTRYPOINT ["sh", "init.sh"]
- Запускаем контейнер
docker run -it -d <image_name>
и проверяем, должен запуститься "неумирающий" контейнер с запущенным nginx внутри.