docker容器在入口点退出

docker容器在入口点退出,docker,dockerfile,docker-build,docker-entrypoint,docker-run,Docker,Dockerfile,Docker Build,Docker Entrypoint,Docker Run,我正在尝试使用docker run命令通过docker文件运行docker容器。下面是我的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 conver

我正在尝试使用docker run命令通过docker文件运行docker容器。下面是我的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
下面是我的开始

#!/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我的容器在Dockerfile的
[“bash”,“/docker entrypoint.sh”]
命令下退出,没有任何错误/消息,但是如果我从Dockerfile中删除entrypoint命令,它工作得很好。我无法找出错误。非常感谢您的帮助。

如果您的映像构建成功,那么您可以尝试在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

以下是我在这个序列中看到的情况:

ENTRYPOINT ["bash", "/docker-entrypoint.sh"]
CMD ["bash", "/home/test/app/start.sh"]
启动容器时,Docker运行
bash/Docker-entrypoint.sh bash/home/test/app/start.sh
。但是,entrypoint脚本根本不会查看其命令行参数,因此您在此处指定的任何
CMD
或在
docker run
命令行末尾发出的任何命令都会被完全忽略

当该入口点脚本运行时:

exec gunicorn&
执行服务nginx启动
#文件结束
它作为后台进程启动
gunicorn
,并继续下一行;然后用
服务
命令替换自身。该
service
命令成为主容器进程,进程ID为1。它启动nginx,并立即返回。现在主容器进程已经返回,容器将退出


对于您编写的这段代码,您应该删除entrypoint脚本末尾的
exec
行,并用just替换它们

exec“$@”
这将导致shell运行其命令行参数(即Dockerfile
CMD


然而,有一个现成的解决方案。通常,如果您需要多个进程,那么将它们作为同一Docker网络上的两个独立容器运行会更容易、更好。这避免了在同一个容器中运行多个内容的复杂性。

尝试过,但仍然没有改进。容器在执行最后一行入口点(即启动nginx)后退出。运行容器时会打印以下消息。启动Gunicorn。启动nginx:nginx.other fix
CMD[“/bin/bash”、“/home/test/app/start.sh”]
no luck Vijay。仍然存在。如果我从Dockerfile中删除entrypoints命令,则其工作正常。请尝试在分离模式下运行run命令
docker run-dit--name test--env file./env test
,然后尝试执行
/home/test/app/start.sh
,以验证脚本是否可执行。按ctrl+d以退出tried docker run-dit--name test--env file./env test,但容器仍然在入口点上退出。