我在码头容器中启动django项目时遇到了问题。我尝试过多种方法,例如:
docker-compose run web python manage.py runserver
或者只是
docker-compose up
我第一次尝试这个没有出错,但是我不能在浏览器中打开这个应用程序,所以我又试了一次,然后它完全停止工作了。我得到了一个错误:
manage.py runserver: error: unrecognized arguments: python manage.py runserver
我的船坞
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
我的文件
# 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" ]
发布于 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
。
对于这个设置,我建议:
如果您希望能够在启动容器时重写该命令(这是有用的),
CMD
而不是ENTRYPOINT
。然后,这些命令重写将替换命令.CMD
。不需要指定组合command:
.您还试图以一种无法工作的方式运行迁移;同样,容器只运行单个进程,最后一个CMD
或启动时覆盖将获胜。我会使用入口点包装器脚本来运行迁移:
#!/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-数组语法)。
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的一部分。
version: '3.8'
services:
db: { ... }
web:
build: .
ports:
- '8000:8000'
environment: { ... }
depends_on:
- db
# but no volumes: or command:
https://stackoverflow.com/questions/73334144
复制相似问题