Пользовательский контейнер nginx немедленно завершает работу, когда часть docker-compose

Я пытаюсь узнать, как использовать docker compose с простой настройкой контейнера nginx, который перенаправляет запросы в контейнер-призрак. Я использую стандартное изображение-призрак, но у меня есть собственный образ nginx (наследуемый от стандартного изображения).

Когда я запускаю композицию с помощью «docker-compose up», она немедленно завершается с «docker_nginx_1, завершено с кодом 0». Однако, когда я собираю и запускаю его вручную, он работает нормально, и я могу перейти в браузере к контейнеру и просмотреть страницу nginx по умолчанию. Что я неправильно понимаю в своем файле композиции, из-за которого он ведет себя иначе, чем созданный на заказ? Что я могу изменить, чтобы он продолжал работать?

Отказ от ответственности: я также изучаю nginx по ходу работы, поэтому изучение двух вещей одновременно может вызывать у меня неуместные проблемы.

РЕДАКТИРОВАТЬ: исходные файлы были немного сложнее, но я сократил проблему до простого: если я использую команду сборки для пользовательского изображения, которое ничего не делает, кроме наследования от изображения nginx по умолчанию, оно немедленно завершается. Если я использую изображение nginx по умолчанию, оно работает. Теперь это актуальные файлы:

Составить файл:

ghost:
 expose:
   - "2368"
 image: ghost

nginx:
  # image: nginx << If I use this instead of my custom build, it doesn't exit
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

nginx / Dockerfile:

FROM nginx

ОРИГИНАЛЬНЫЕ ФАЙЛЫ (с тем же файлом набора, что и выше):

nginx / Dockerfile:

FROM nginx
RUN rm /etc/nginx/nginx.conf
COPY conf/nginx.conf /etc/nginx/nginx.conf
COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost
RUN mkdir /etc/nginx/sites-enabled
RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost

EXPOSE 80 443

# Is this even the right command I have no idea

CMD service nginx start

nginx / conf / nginx.conf:

daemon off;

user  nginx;
# Let nginx figure out the processes I guess
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

nginx / conf / сайты-доступные / призрак

server {
  listen 80;
  server_name 127.0.0.1;
  access_log /var/log/nginx/localhost.log;

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header HOST $http_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://0.0.0.0:2368;
    proxy_redirect off;
  }
}

Запуск компоновки:

plays-MacBook-Pro:docker play$ docker-compose up
Creating docker_ghost_1...
Creating docker_nginx_1...
Attaching to docker_ghost_1, docker_nginx_1
docker_nginx_1 exited with code 0
Gracefully stopping... (press Ctrl+C again to force)
Stopping docker_ghost_1... done

Запуск вручную:

plays-MacBook-Pro:nginx play$ docker build --no-cache -t nginx_custom .
Sending build context to Docker daemon 8.704 kB
Step 0 : FROM nginx
 ---> 914c82c5a678
Step 1 : RUN rm /etc/nginx/nginx.conf
 ---> Running in 4ce9de96bb36
 ---> 98f97a9da4fc
Removing intermediate container 4ce9de96bb36
Step 2 : ADD conf/nginx.conf /etc/nginx/nginx.conf
 ---> dd3e089208a9
Removing intermediate container 36b9a47e0806
Step 3 : ADD conf/sites-available/ghost /etc/nginx/sites-available/ghost
 ---> 55fae53e5810
Removing intermediate container a82741d24af4
Step 4 : RUN mkdir /etc/nginx/sites-enabled
 ---> Running in 7659ead01b7b
 ---> 406be1c42394
Removing intermediate container 7659ead01b7b
Step 5 : RUN ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/ghost
 ---> Running in e9658a08affa
 ---> 021a84216e8a
Removing intermediate container e9658a08affa
Step 6 : EXPOSE 80 443
 ---> Running in 230e4523794c
 ---> 23d85e1a04cb
Removing intermediate container 230e4523794c
Step 7 : CMD service nginx start
 ---> Running in 209e129cae21
 ---> d7004d6fa223
Removing intermediate container 209e129cae21
Successfully built d7004d6fa223
plays-MacBook-Pro:nginx play$ docker run -t nginx_custom
[It sits here on an empty line, running in the background]

person Merrillogic    schedule 15.11.2015    source источник
comment
Можете ли вы попробовать без COPY conf/sites-available/ghost /etc/nginx/sites-available/ghost, но просто посмотреть, не проблема ли это при использовании с docker compose?   -  person VonC    schedule 16.11.2015
comment
Кроме того, поскольку github.com/dockerfile/nginx/blob/master/Dockerfile#L26 уже определяет CMD, попробуйте без CMD.   -  person VonC    schedule 16.11.2015
comment
@VonC Увы, он все равно немедленно завершается, если я удалю команду COPY, и даже если я уменьшу ее до FROM nginx   -  person Merrillogic    schedule 16.11.2015
comment
Пришел сюда через 5 лет после того, как OP опубликовал этот вопрос. Мой был контейнером, работающим на Nginx:stable-alpine образе. Меня спас stackoverflow.com/a/55907197/6388351! Хотя это своего рода хакерство для локальной разработки.   -  person Benny64    schedule 29.01.2021


Ответы (4)


Просто столкнулся с той же проблемой, и первоначальное исправление заключалось в изменении имени службы в docker-compose.yml.

Это сработало, но причина в том, что это сработало, это то, что Docker-compose кэширует сборку и связывает ее с именем службы. Каждый docker-compose up после первого просто использует то, что было создано ранее, поэтому любые изменения, которые вы вносите в Dockerfile или этот раздел docker-compose.yml, в основном игнорируются.

Когда вы (и я) изменили имя службы, это запустило новую сборку, поскольку это имя службы раньше не было помечено.

Настоящее решение - выполнить: сборку docker-compose для восстановления изображения (за которым следует docker-compose up). Их документация не особо подчеркивает эту проблему.

person Gerrat    schedule 11.03.2016
comment
Это должен быть принятый ответ. Я использовал docker build, но, очевидно, при использовании compose вам нужно перестроить, используя docker-compose build - person Jody; 30.03.2016

CMD в вашем Dockerfile должен запускать процесс, который должен выполняться на переднем плане. Команда service nginx start запускает процесс в режиме демона, и, таким образом, ваш контейнер завершается без ошибок, потому что завершается команда service.

Используйте следующий CMD ["nginx", "-g", "daemon off;"] для запуска nginx (взято из официального образа), и он должен работать правильно.

person mike    schedule 16.11.2015
comment
К сожалению, похоже, это не помогает. У меня daemon off; в файле nginx.conf, так что это не должно быть проблемой с приведенным выше кодом. Но чтобы убедиться, что я тщательно протестировал его, я сделал файл докеров просто FROM nginx CMD ["nginx", "-g", "daemon off;"], и он по-прежнему немедленно закрывается. Это даже с FROM nginx. Я обновлю вопрос соответственно этой информацией. - person Merrillogic; 16.11.2015
comment
daemon off не демонизирует процесс. service nginx start указывает ему работать в фоновом режиме, а не на переднем плане. Это правильный ответ. Если вы замените CMD service nginx start на CMD nginx ..., он должен начаться на переднем плане. - person dnephin; 17.11.2015
comment
@dnephin Хотя это кажется правдой, это не действие, которое заставляет мою конкретную конфигурацию функционировать должным образом. Переход на CMD ["nginx", "-g", "daemon off;"] не заставляет его работать. Когда имя в compose изменяется, оно функционирует. ДОЛЖНА ли она работать с service nginx start, я не знаю, но, похоже, работает. Если вы хотите попробовать, есть образец репозитория по адресу gitlab.com/merrillogic/docker -compose-nginx с двумя коммитами - неработающим и рабочим. Возможно, есть дополнительный фактор, который заставляет это плохо себя вести. - person Merrillogic; 17.11.2015
comment
У меня был CMD ["nginx"], и контейнер выходил с кодом состояния 0. Изменение его на CMD ["nginx", "-g", "daemon off;"] полностью устранило проблему. Большое спасибо! - person Lashae; 17.01.2019
comment
Это сработало и для меня, спасибо - person Jascha Muller; 20.12.2020

Вы также можете добавить

tty: true

к службе в вашем docker-compose.yml:

webserver:
    build: .
    volumes:
        - "./src:/var/www/html"
    ports:
        - 8080:80
    depends_on:
        - aap-mysql
    tty: true

и он должен продолжать работать после

docker-compose up
person Bernhard Zürn    schedule 02.01.2017

Я разобрался, что это было. Мне нужно было назвать часть моей композиции nginx чем-нибудь, кроме nginx. Я не уверен, потому что это уже есть изображение nginx или это что-то еще, но его изменение заставило его работать правильно.

Изменив мой файл набора на:

ghost:
 expose:
   - "2368"
 image: ghost

mything:
  # image: nginx
  build: ./nginx
  ports:
    - "80:80"
    - "443:443"
  links:
   - ghost

Я смог заставить его работать. Индикатором было то, что когда имя изменилось, я действительно увидел выходные данные процесса сборки для моего контейнера. Если кто-то точно знает, почему именование должно быть таким, я хотел бы знать.

person Merrillogic    schedule 16.11.2015
comment
Я только что столкнулся с той же проблемой ... назвал мою сервисную сеть. ... и ничего не получилось. ... часы поиска / настройки того, что я мог сделать неправильно в своей настройке, в конечном итоге привели меня к этому сообщению. - person Gerrat; 12.03.2016
comment
@Merrillogic: см. Мой ответ для exactly why the naming needs to be that way - person Gerrat; 12.03.2016