【问题标题】:Django app server hangs / won't start in Docker ComposeDjango 应用服务器挂起/无法在 Docker Compose 中启动
【发布时间】:2016-08-06 03:20:34
【问题描述】:

我正在尝试在 Docker Compose 中启动一个简单的 Django 应用服务器,并与 Postgres 容器配对。正如我所料,它启动了入口点脚本,但它似乎从未真正运行过 Django 应用程序服务器(这应该是最后一步,并继续运行)。

我知道它运行入口点脚本,因为迁移步骤已运行。应用服务器永远不会输出任何预期的输出,并且端口 8000 永远不会响应。

如果重要的话,我正在使用 Docker for Mac(稳定版)。

我的 Django 应用容器的 Dockerfile:

FROM ubuntu:16.04

COPY my_app /my_app

RUN apt-get update \
 && apt-get install -y python3 python3-psycopg2 python3-pip

RUN apt-get install -y nodejs npm

WORKDIR /my_app
RUN pip3 install -r requirements.txt
RUN npm install bower
RUN python3 manage.py bower install
RUN python3 manage.py collectstatic --no-input

EXPOSE 8000

COPY entrypoint.sh /
RUN chmod 755 /entrypoint.sh

CMD python3 manage.py runserver 0.0.0.0:8000
ENTRYPOINT ["/entrypoint.sh"]

Django 入口点脚本:

#!/bin/sh

# Allow database container to start up or recover from a crash
sleep 10

cd /my_app

# Run any pending migrations
python3 manage.py migrate

exec $@

docker-compose.yml:

version: '2'
services:
  db:
    image: postgres:9.6
    volumes:
      - ./db/pgdata:/pgdata
    environment:
      - POSTGRES_USER=my_user
      - POSTGRES_PASSWORD=my_password
      - PGDATA=/pgdata
      - POSTGRES_DB=my_database
  appserver:
    image: my-image
    command: python3 manage.py runserver 0.0.0.0:8000
    ports:
      - '8000:8000'
    environment:
      - POSTGRES_USER=my_user
      - POSTGRES_PASSWORD=my_password
      - POSTGRES_DB=my_database
    links:
      - db
    depends_on:
      - db

【问题讨论】:

  • 除了内置的 Django 开发服务器通常不适合生产系统外,它在 Docker 容器中也不能正常运行。以 root 身份运行东西也不是最佳实践。我希望你这样做只是为了玩,而不是把它放在互联网上。 blog.dscpl.com.au/2015/12/…blog.dscpl.com.au/2015/12/don-run-as-root-inside-of-docker.html
  • @GrahamDumpleton 这只是第一步,一切都在我的笔记本电脑上。在我解决了所有这些细节之后,它最终将是一个 uwsgi/nginx 设置。感谢您的说明。

标签: python django docker docker-compose


【解决方案1】:

在您的 Dockerfile 中使用 CMD 的 exec 表单

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

entrypoint.sh 脚本 exec 当前正在尝试运行:

/bin/sh -c python3 manage.py runserver 0.0.0.0:8000

这似乎不起作用,我认为它只是在运行python3

您应该quote the positional parameters variable 以便shell 维护每个参数,即使有空格。

exec "$@"

但最好不要在 docker 和您的应用程序之间使用 sh,因此请始终使用 exec 表单作为 CMD

【讨论】:

  • 没有问题.. exec 的小更新也是如此。 $@ 应始终被引用。
猜你喜欢
  • 2016-02-07
  • 2020-06-30
  • 2022-01-23
  • 2018-12-16
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
相关资源
最近更新 更多