Пользовательский контейнер nginx немедленно выгружается, когда часть сокета-докера
Я пытаюсь научиться использовать докеры с простой настройкой контейнера nginx, который перенаправляет запросы в контейнер-призрак. Я использую стандартное изображение-призрак, но имею пользовательское изображение nginx (которое наследуется от стандартного образа).
Когда я запускаю композицию, используя команду "docker-compose up", она немедленно выводится с "docker_nginx_1, выходящим с кодом 0". Однако, когда я создаю и запускаю его вручную, он работает нормально, и я могу перемещаться по моему браузеру в контейнер и просматривать страницу nginx по умолчанию. Что я не понимаю о компиляционном файле, который заставляет его вести себя иначе, чем создание на заказ? Что я могу изменить, чтобы заставить его работать?
Отказ от ответственности: я также изучаю nginx, когда я ухожу, поэтому изучение двух вещей сразу может вызвать у меня неоправданные проблемы.
EDIT:
Исходные файлы были немного сложнее, но я просто уменьшил проблему: если я использую команду сборки для пользовательского изображения, которое ничего не делает, а наследует от изображения 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]
Ответы
Ответ 1
Просто столкнулся с этой же проблемой, и первоначальное исправление заключалось в том, чтобы изменить имя службы в docker-compose.yml
.
Это сработало, но сработала причина, потому что Docker-compose кэширует сборку и связывает ее с именем службы. Каждый docker-compose up
после первого использует только то, что он создал раньше, поэтому любые изменения, которые вы делаете в Dockerfile
или в этом разделе docker-compose.yml
, в основном игнорируются.
Когда вы (и я) изменили имя службы, оно вызвало новую сборку, так как это имя службы ранее не было помечено.
Решением real является: сборка docker-compose для восстановления изображения (за которым следует docker-compose up
). Их документация не особо подчеркивает эту проблему.
Ответ 2
CMD в вашем Dockerfile
должен запустить процесс, который должен выполняться на переднем плане. Команда service nginx start
запускает процесс в режиме deamon, и, таким образом, ваш контейнер выходит из строя, потому что команда service
завершает работу.
Используйте следующий CMD ["nginx", "-g", "daemon off;"]
, чтобы запустить nginx (взятый из официального изображения), и он должен работать правильно.
Ответ 3
Вы также можете добавить
tty: true
к сервису в вашем docker-compose.yml.. например
webserver:
build: .
volumes:
- "./src:/var/www/html"
ports:
- 8080:80
depends_on:
- aap-mysql
tty: true
и он должен оставаться включенным после
docker-compose up
Ответ 4
Я понял, что это было. Мне нужно было назвать часть nginx моей композиции чем-то иным, чем "nginx". Я не уверен, что это потому, что уже есть изображение nginx или это что-то другое, но его изменение заставило его работать правильно.
Изменив мой файл компоновки на:
ghost:
expose:
- "2368"
image: ghost
mything:
# image: nginx
build: ./nginx
ports:
- "80:80"
- "443:443"
links:
- ghost
Я смог заставить его работать. Показателем было то, что когда имя изменилось, я фактически видел вывод процесса сборки для моего контейнера. Если кто-то точно знает, почему именование должно быть таким, я хотел бы знать.