首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用没有识别的runserver参数运行django应用程序

使用没有识别的runserver参数运行django应用程序
EN

Stack Overflow用户
提问于 2022-08-12 12:23:03
回答 1查看 201关注 0票数 1

我在码头容器中启动django项目时遇到了问题。我尝试过多种方法,例如:

代码语言:javascript
运行
复制
docker-compose run web python manage.py runserver

或者只是

代码语言:javascript
运行
复制
docker-compose up

我第一次尝试这个没有出错,但是我不能在浏览器中打开这个应用程序,所以我又试了一次,然后它完全停止工作了。我得到了一个错误:

代码语言:javascript
运行
复制
manage.py runserver: error: unrecognized arguments: python manage.py runserver

我的船坞

代码语言:javascript
运行
复制
version: "3.9"

services:
  db:
    image: postgres:alpine
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=gitlabdumptables
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=gitlabdumptables
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

我的文件

代码语言:javascript
运行
复制
# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip3 install -r requirements.txt
CMD python manage.py makemigrations
CMD python manage.py migrate
COPY . /code/
ENTRYPOINT [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 13:31:30

在Docker容器中运行的主要进程由两个部分组成。您将在Dockerfile中提供一个ENTRYPOINT,然后在CMD中提供与Compose command:docker run ./manage.py ...参数相等的内容。当您同时拥有一个ENTRYPOINT和一个CMD时,the CMD gets passed as additional arguments to the ENTRYPOINT;所以在本例中,您正在运行python manage.py runserver 0.0.0.0:8000 python manage.py runserver 0.0.0.0:8000

对于这个设置,我建议:

如果您希望能够在启动容器时重写该命令(这是有用的),

  • 将更倾向于在您的Dockerfile中使用CMD而不是ENTRYPOINT。然后,这些命令重写将替换命令.
  • ,如果您有一个有用的默认命令(这是您要做的),将其作为Dockerfile CMD。不需要指定组合command:.

您还试图以一种无法工作的方式运行迁移;同样,容器只运行单个进程,最后一个CMD或启动时覆盖将获胜。我会使用入口点包装器脚本来运行迁移:

代码语言:javascript
运行
复制
#!/bin/sh
# entrypoint.sh

# Run migrations
python manage.py migrate

# Then run the main container command (passed to us as arguments)
exec "$@"

在您的Dockerfile中,确保这是COPY编辑的(现有的COPY命令将这样做),并使这个脚本成为ENTRYPOINT (具有JSON-数组语法)。

代码语言:javascript
运行
复制
FROM python:3.10
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY ./ ./
ENTRYPOINT ["./entrypoint.sh"]                           # must be JSON-array form
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] # not ENTRYPOINT

在您的撰写文件中,您不需要使用volumes:注入代码或替换command:,这些已经是您的Dockerfile的一部分。

代码语言:javascript
运行
复制
version: '3.8'
services:
  db: { ... }
  web:
    build: .
    ports:
      - '8000:8000'
    environment: { ... }
    depends_on:
      - db
    # but no volumes: or command:
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73334144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档