Контейнер завершился с кодом 0 при запуске из docker -compose - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь запустить контейнер из файла docker.

**docker-compose.yml**
    services:
        djangoapp:
            build: .
            volumes:
              - .:/opt/services/djangoapp/src
            ports:
              - 8000:8000

**Dockerfile** this is entry in Docker file
    ENTRYPOINT bash start.sh
**start.sh**
    #!/bin/bash
    ## run gunicorn in background......
    gunicorn --chdir hello --bind :8000  hello_django.wsgi:application &

когда я создаю образ из того же Dockerfile , он работает нормально. когда я запускаю из docker -compose up, он показывает завершено с кодом 0 . Я хотел знать причину, по которой мой docker завершился (Exited (0) 18 секунд a go) ??

1 Ответ

0 голосов
/ 09 мая 2020

Ваш start.sh скрипт запускает несколько фоновых процессов, затем достигает конца и завершается (успешно, то есть с кодом состояния 0). Когда сценарий start.sh завершается, поскольку это ENTRYPOINT контейнера, контейнер выходит с тем же кодом состояния.

Должен быть какой-то процесс, работающий как процесс переднего плана, и контейнер будет продолжать работать как пока этот процесс есть. В вашем случае это процесс GUnicorn, и вы можете указать это как изображение CMD в Dockerfile:

CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application

Если единственное, что в вашем скрипте start.sh выполняет эту строку, вы можете удалить строка ENTRYPOINT. Если нет, измените его на запуск exec "$@" в качестве последней строки (для запуска CMD) и измените строку Dockerfile ENTRYPOINT на JSON синтаксис массива:

RUN chmod +x start.sh
ENTRYPOINT ["./start.sh"]
CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
#!/bin/sh
# ... do other pre-launch setup ...
# Run the CMD
exec "$@"

(Я бы избегал запускать фоновые процессы в сценарии запуска контейнера: ничто не будет отслеживать или перезапускать их, и вы можете оказаться в состоянии, когда у вас есть наполовину запущенный контейнер или когда вам без необходимости нужно перезапускать некоторые вещи, потому что другие получили Если вам нужно запустить несколько процессов, попробуйте организовать их запуск в отдельных контейнерах; если вам нужен только один, запустите его как процесс переднего плана.)

...