Докер контейнер выходит из точек входа - PullRequest
3 голосов
/ 08 марта 2019

Я пытаюсь запустить Docker-контейнер через Dockerfile с помощью команды Docker Run.Ниже приведен мой Dockerfile.

FROM python:3.6
# for imaging stuff
RUN apt-get update
RUN apt install libmagickwand-dev
# Create  app directory
RUN mkdir -p /home/test/app
# Install Libre Office and ghostscript for pdf conversion and repairing
RUN apt-get update -qq \
    && apt-get install -y -q libreoffice \
    && apt-get remove -q -y libreoffice-gnome \
    && apt-get update \
    && apt-get -y install ghostscript \
    && apt-get -y install nano \
    && apt-get -y install poppler-utils \
    && apt-get install -y nginx
# Cleanup after apt-get commands
RUN apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
    /var/cache/apt/archives/*.deb /var/cache/apt/*cache.bin
# Activate WORKING DIR
WORKDIR /home/test/app
# Initiating devnull directory
RUN mkdir -p dev_null
# Copying requirements
COPY requirements/local.txt /tmp/requirements.txt
# Install the app dependencies
RUN pip install -r /tmp/requirements.txt
COPY id_rsa /root/.ssh/id_rsa
COPY requirements/private.txt /tmp/private.txt
RUN ssh-keyscan -T 60 bitbucket.org >> /root/.ssh/known_hosts \
    && chmod 600  /root/.ssh/id_rsa \
    && pip install -r /tmp/private.txt
# Envs
ENV DJANGO_SETTINGS_MODULE app.settings.local
ENV ENVIORNMENT local
# ADD the source code and entry point into the container
ADD . /home/test/app
ADD docker-entrypoint.sh /home/test/app/docker-entrypoint.sh
# Making entry point executable
RUN apt-get update && apt-get install -y supervisor \
    && apt-get install -y nginx
#RUN mkdir -p /var/log/test
#COPY supervisor.conf /etc/supervisor/conf.d/supervisor.conf
RUN chmod +x docker-entrypoint.sh
RUN mkdir -p /var/log/test
COPY supervisor.conf /etc/supervisor/conf.d/supervisor.conf
# Exposing port


# Copy entrypoint script into the image
COPY ./docker-entrypoint.sh /
COPY ./django_nginx.conf /etc/nginx/
RUN chmod +x start.sh

#RUN chmod +x /docker-entrypoint.sh
EXPOSE 8000
ENTRYPOINT ["bash", "/docker-entrypoint.sh"]
CMD ["bash", "/home/test/app/start.sh"]

и ниже указаны мои точки входа.

#!/usr/bin/env bash
set -e

# ToDo Need to enable this
#until psql $DATABASE_URL -c '\l'; do
#  >&2 echo "Postgres is unavailable - sleeping"
#  sleep 1
#done
#
#>&2 echo "Postgres is up - continuing"
cd app
mkdir -p app/keys
if [[ ! -e /var/log/gunicorn-access.log ]]; then
    touch /var/log/gunicorn-access.log
fi
if [[ ! -e /var/log/gunicorn-error.log ]]; then
    touch /var/log/gunicorn-error.log
fi

if [ "x$DJANGO_MANAGEPY_MIGRATE" = 'xon' ]; then
    echo "Django starting to migrate un-applied migrations"
    python manage.py migrate --noinput
fi

if [ "x$DJANGO_MANAGEPY_COLLECTSTATIC" = 'xon' ]; then
    echo "Django starting to collect static data"
    python manage.py collectstatic --noinput
fi

if [ "x$DJANGO_LOADDATA" = 'xon' ]; then
    python manage.py loaddata taxing/fixtures/province-taxing-table-initial-data.json
fi

if [ "x$LOAD_TEMPLATE_FROM_S3" = 'xtrue' ]; then
    echo "loading s3"
    python manage.py loadindex

fi


# Start Gunicorn processes
echo Starting Gunicorn.
exec gunicorn test.wsgi:application \
    --name test \
    --workers 3 \
    --log-level=info \
    --log-file=/srv/logs/gunicorn.log \
    --access-logfile=/srv/logs/access.log &

exec service nginx start

, а ниже - мой start.sh

#!/bin/bash

echo "I am running"
echo "Belive me"
/usr/bin/supervisord -n

и ястроим контейнер с docker build -t test . и он строит просто отлично.Но когда я пытаюсь запустить этот контейнер, используя docker run --name test --env-file ./env test, мой контейнер завершается по команде ["bash", "/docker-entrypoint.sh"] команды Dockerfile без каких-либо ошибок / сообщений, но если я удаляю команду точки входа из Dockerfile, все работает нормально.Я не могу обнаружить ошибку.Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вот что я вижу в этой последовательности:

ENTRYPOINT ["bash", "/docker-entrypoint.sh"]
CMD ["bash", "/home/test/app/start.sh"]

Когда вы запускаете контейнер, Docker запускает bash /docker-entrypoint.sh bash /home/test/app/start.sh. Однако сценарий точки входа никогда не просматривает свои аргументы командной строки, поэтому любая CMD, указанная вами здесь, или любая команда, которую вы даете в конце командной строки docker run, полностью игнорируется.

Когда выполняется сценарий этой точки входа:

exec gunicorn ... &
exec service nginx start
# end of file

запускается gunicorn как фоновый процесс и продолжается до следующей строки; затем он заменяет себя командой service. Эта команда service становится основным контейнерным процессом и имеет идентификатор процесса 1. Она запускает nginx и немедленно возвращается. Теперь, когда основной процесс контейнера возвращен, контейнер завершает работу.


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

exec "$@"

, что заставит оболочку запустить параметры командной строки (то есть Dockerfile CMD).

Однако, есть легкодоступное изображение Dogin nginx . Как правило, если вам нужно несколько процессов, проще и лучше запускать их как два отдельных контейнера в одной сети Docker. Это позволяет избежать сложностей, связанных с попытками запустить несколько вещей в одном контейнере.

0 голосов
/ 08 марта 2019

Если ваше изображение успешно создается, вы можете попробовать добавить эту строку в свой файл start.sh

tail -f /etc/issue

Ваш файл start.sh может выглядеть следующим образом:

#!/bin/bash

echo "I am running"
echo "Belive me"
/usr/bin/supervisord -n
tail -f /etc/issue
...