【问题标题】:Unable to runserver with docker-compose up无法使用 docker-compose up 运行服务器
【发布时间】:2018-05-08 09:03:32
【问题描述】:

我在开发时使用 Docker。我注意到我无法使用docker-compose up 命令启动开发服务器,但可以使用docker-compose run

这是我的 Dockerfile:

FROM python:3.6

WORKDIR /opt/lib
RUN pip install --upgrade pip
COPY requirements.txt ./
RUN pip install -r requirements.txt

WORKDIR /opt/web

这里是 docker-compose.yaml

version: '2'
services:
  web:
    build: ./web/
    working_dir: /opt/web
    ports:
      - "3000:3000"
    volumes:
      - ./web:/opt/web
    user: 1000:1000
    depends_on:
      - database
    env_file: env
    command: python manage.py runserver 0.0.0.0:3000

  database:
    image: mdillon/postgis:9.6
    ports:
      - "5432:5432"
    volumes:
      - ./database/data:/var/lib/postgresql/data

现在,如果我运行 docker-compose up,则只有数据库启动:

但是使用docker-compose run 服务器可以正常启动:

如果我将 docker-compose.yml > services > web > 命令更改为 /usr/local/bin/gunicorn project.wsgi:application -w 4 -b :3000 它也可以正常工作,但我需要在文件更改时自动重启

我在 MacOS 上使用 Docker Version 18.03.1-ce-mac65 (24312)Django==1.10

我尝试将其重置为出厂设置,但没有帮助。

你能帮我解决这个问题吗?

编辑 1:

其他 manage.py 命令,例如 migrate,工作正常

【问题讨论】:

  • python:3.6 中的 ENTRYPOINT 是 python 而不是 shell(或 bash),所以你不必再次运行 python,我想你可以试试./manage.py runserver 0.0.0.0:3000
  • @MazelTov 是的,可能是。但这无济于事,无论如何
  • docker-compose up web 的输出是什么?
  • @MazelTov 在Attaching to mein-dach-web_web_1 之后什么都没有。似乎它只是挂起。 docker exec <container id> ps 输出:PID TTY TIME CMD 1 ? 00:00:00 蟒蛇 51 ? 00:00:02蟒蛇99? 00:00:00 ps

标签: python django docker docker-compose


【解决方案1】:

./manage.py runserver 需要分配一个伪 TTY。您可以通过这种方式将其传递给 docker-compose.yml

services:
  web:
    tty: true
    command: ./manage.py runserver 0:3000

【讨论】:

    【解决方案2】:

    正如您稍后提到的,您应该在撰写文件中指定命令,但带有reload选项。

    像这样:

    command: /usr/local/bin/gunicorn project.wsgi:application -w 4 -b :3000 --reload

    official docs ref

    【讨论】:

    • @atomAltera runserver 是开发服务器,不应在生产中使用
    • @Zulu,我需要它来开发
    【解决方案3】:

    就我而言,我只在第一次运行 docker-compose up 时遇到了这个问题。发生这种情况是因为数据库初始化花费了太长时间。所以只需按Ctrl-C 并再次运行docker-compose up

    depends_on 并不真正监控数据库服务器状态——它监控容器状态。因此,它会在数据库真正准备好连接之前启动您的 Web 应用程序。

    是的,Mazel Tov 建议的 tty: true 非常有用。没有它,您将不会看到有助于您理解问题的 Django 错误消息(我不知道为什么)。

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      相关资源
      最近更新 更多