Сервис Docker-compose завершился с кодом 0 - PullRequest
1 голос
/ 17 октября 2019

Я довольно новичок в Docker. Я пытаюсь запустить Django на Docker. Ниже приведен мой файл docker-compose .

version: '2'
services:
    django:
        build:
          context: .
          dockerfile: ./deploy/dev/Dockerfile
        tty: true
        command: python manage.py runserver 0.0.0.0:8000
        ports:
              - "8000:8000"
        volumes:
            - ./app:/src/app
        depends_on:
            - "workflow_db"
            - "rabbitmq"
        env_file:
            - ./deploy/dev/envvar.env
    workflow_db:
        image: postgres:9.6
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        environment:
            - POSTGRES_USER=hello_django
            - POSTGRES_PASSWORD=hello_django
            - POSTGRES_DB=hello_django
    rabbitmq:
        image: "rabbitmq:3-management"
        hostname: "rabbitmq"
        environment:
            RABBITMQ_ERLANG_COOKIE: "SWQOKODSQALRPCLNMEQG"
            RABBITMQ_DEFAULT_USER: "rabbitmq"
            RABBITMQ_DEFAULT_PASS: "rabbitmq"
            RABBITMQ_DEFAULT_VHOST: "/"
        ports:
            - "15672:15672"
            - "5672:5672"
volumes:
  postgres_data:

DockerFile

FROM python:3.7-alpine

RUN apk update && apk add --no-cache gcc libffi-dev g++ python-dev build-base linux-headers postgresql-dev postgresql postgresql-contrib pcre-dev bash alpine-sdk \
  && pip install wheel

#Copy over application files
COPY ./app /src/app

#Copy over, and grant executable permission to the startup script
COPY ./deploy/dev/entrypoint.sh /
RUN chmod +x /entrypoint.sh

WORKDIR /src/app

#Install requirements pre-startup to reduce entrypoint time
RUN pip install -r requirements.txt

ENTRYPOINT [ "/entrypoint.sh" ]

И, наконец, мой entrypoint.sh

#! /bin/bash

cd /src/app || exit

echo "PIP INSTALLATION" && pip install -r requirements.txt

echo "UPGRADE" && python manage.py migrate

# echo "uwsgi" && uwsgi "uwsgi.ini"

Я делаю django-compose build, он создает образ. Но когда я делаю docker-compose up django_1 exited with code 0.

Однако, если я раскомментирую последнюю строку в entrypoint.sh, она будет работать отлично.

Может кто-нибудь помочь мне понять причину этого?

Ответы [ 3 ]

1 голос
/ 17 октября 2019

Когда у вас есть и команда, и точка входа, Docker запускает только точку входа и передает ей команду в качестве аргументов. См. Понимание того, как CMD и ENTRYPOINT взаимодействуют в документации Dockerfile. Как только точка входа завершается, контейнер заканчивается;он может делать с командной частью все, что ему нравится, включая полное игнорирование.

Обычная практика - завершать сценарий точки входа с помощью

exec "$@"

, что заставляет его просто взять командную строкуаргументы и запустите их как команду, заменив скрипт точки входа в качестве основного процесса контейнера.

Без этого вы добираетесь до конца скрипта точки входа, и контейнер сделал все, что ему было сказано, поэтому онуспешно завершен (код состояния 0).

0 голосов
/ 17 октября 2019

Если вы хотите, чтобы контейнер продолжал работать, вам нужно:

  1. запустить процесс переднего плана
  2. подключиться к его терминалу с помощью --ti

вам нужно соединиться с терминалом, чтобы увидеть, если команда python не выполняется, когда uwsgi не выполняется, следовательно, остановка контейнера

0 голосов
/ 17 октября 2019

AFAIU, когда вы раскомментируете последнюю строку в точке входа, у контейнера больше нет процесса переднего плана, который может поддерживать его и работать, следовательно, он выходит со статусом 0. У точки входа должен быть процесс переднего плана, чтобы поддерживать контейнер иБег. Кроме того, вы выполняете "pip install" несколько раз. Этот шаг должен быть просто в Dockerfile.

Попробуйте переместить python manage.py runserver 0.0.0.0:8000 в entrypoint.sh.

Обновление -

В случае конфликта портов контейнер не выйдет со статусом 0 и ошибкой конфликта портовс приходить в STDOUT. Кроме того, когда он раскомментирует, нет вероятности конфликта портов. Похоже, что процесс переднего плана вообще не выполняется.

...