【问题标题】:django runserver hangs in docker-compose up but runs correctly in docker-compose rundjango runserver 在 docker-compose up 中挂起,但在 docker-compose run 中正确运行
【发布时间】:2019-04-21 14:37:36
【问题描述】:

编辑

将 --ipv6 添加到命令中,虽然没有正确配置,但似乎超过了进程挂起的点。

问题

  • 调用 docker-compose up 会执行 runserver,但在打印当前时间后会挂起。

  • 调用 docker-compose run -p 8000:8000 web python manage.py runserver 0.0.0.0:8000 也会执行服务器,但执行成功并且可以在 192.168.99.100:8000 到达.

问题

为什么我可以直接从 shell 中的 docker-compose 运行服务器,但不能从 .yml 文件运行?

对我来说,.yml 文件的内容和 shell 中的 docker-compose 运行行非常相似。

我能想到的唯一区别可能是正确启动 django 服务器所需的某种级别的权限,但我不知道如何解决这个问题。 Docker 在 Windows 8.1 机器上运行。我的虚拟机的共享文件夹是默认的 c:\Users。

文件

我的文件夹包含一个新的 django 项目以及这些 docker 文件。我篡改了不同版本的python和django,但结果是一样的。我已经在尝试使用

之间清理了我的图像和容器
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

docker-compose.yml

version: '3'
services:
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/code
        ports:
            - "8000:8000"

Dockerfile

FROM python:3.6-alpine
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

requirements.txt

Django>=1.8,<2.0

系统

我的操作系统是windows 8.1

【问题讨论】:

  • 为什么你在 dockerfile 中绑定 localhost:8080 而不是 0.0.0.0:8080?
  • 哦,应该是 0.0.0.0:8000。但是,它仍然以相同的方式挂起。我只是在一些测试后忘了改回来。
  • 如果在撰写文件中删除 volumes: - .:/code 会怎样
  • 从我的撰写文件中删除 volumes: - .:/code 并运行它仍然会导致服务器在启动时挂起。我列出了有卷的目录(ls -l),没有卷和运行命令,我注意到有卷和运行命令列出了具有相同权限的相同文件(-rwxrwxrwx),而没有卷的权限是-rwxr-xr-x。我不知道这是否有任何意义。
  • 如果我添加行user: root,即使没有volumes,权限似乎也匹配,尽管它仍然挂起。

标签: python django docker docker-compose


【解决方案1】:

我自己也遇到了这个问题,看来您需要为您的容器分配一个 tty 和一个 stdin 才能使 runserver 工作:

  python:
    image: my-image:latest
    stdin_open: true # docker run -i
    tty: true # docker run -t
    build:
      context: ..
      dockerfile: docker/Dockerfile

【讨论】:

  • stdin_open: truetty: true 还修复了 http.server/BaseHTTPRequestHandler 中的挂起问题。
【解决方案2】:

我遇到了同样的问题,无法让它做任何其他事情。但是,当我转到 docker 机器的 ip docker-machine ip 它返回 192.168.99.100,然后转到 192.168.99.100:8000,我的 docker 容器开始接收请求

【讨论】:

    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多