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 шт):

Автор решения: Sergei Kirjanov

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
→ Ссылка
Автор решения: Константин Пак

Была такая же проблема, решил так:

  1. Создаем bash файл например с названием "init.sh":

    #!/bin/sh

    service nginx start

    #тут еще любые команды, например запуск php-fpm

    bash

  2. В dockerfile пишем

COPY init.sh init.sh

ENTRYPOINT ["sh", "init.sh"]

  1. Запускаем контейнер

docker run -it -d <image_name>

и проверяем, должен запуститься "неумирающий" контейнер с запущенным nginx внутри.

→ Ссылка