django - Docker-compose 服务退出,代码为 0

标签 django docker uwsgi

我对 Docker 很陌生。我正在尝试在 Docker 上运行 Django。以下是我的 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 的最后一行,它运行得非常好。

有人可以帮我理解背后的原因吗?

最佳答案

当您同时拥有命令和入口点时,Docker 只会运行入口点,并将命令作为参数传递给它。见 Understand how CMD and ENTRYPOINT interact在 Dockerfile 文档中。一旦入口点退出,容器就结束了;它可以对命令部分做任何它喜欢的事情,包括完全忽略它。

典型的做法是结束入口点脚本

exec "$@"

这导致它只接受其命令行参数并将它们作为命令运行,将入口点脚本替换为主容器进程。

没有这个,你会到达入口点脚本的末尾,容器已经完成了它被告知要做的所有事情,所以它成功退出(状态代码 0)。

关于django - Docker-compose 服务退出,代码为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58428601/

相关文章:

python - Django 通用 View : When to use ListView vs. DetailView

python - 无法在 AWS Elastic Beanstalk 上找到 Django 应用程序的模块

networking - 从 docker 容器运行 docker build 时主机名解析失败

ubuntu - 带有 uWSGI : Can't set as system service on Ubuntu 的 flask

python Django - 将 SQL 查询转换为 ORM 查询(子查询)

python - 如何在CBV中实现get_template_names()函数?

ruby-on-rails - 在 Rails 中使用 Pry 和 Docker compose

docker - 在使用 nginx 部署应用程序时访问 URL 路由时如何修复 404 not found?

uwsgi - 是否可以在 harakiri 之后禁用 uWSGI 的重试机制?

linux - uwsgi 启动失败但不记录任何错误