docker入口点行为与Django

2024-10-03 17:17:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用uwsgi制作我的第一个django容器。其工作原理如下:

FROM python:3.5

RUN apt-get update && \
    apt-get install -y && \
    pip3 install uwsgi

COPY ./projects.thux.it/requirements.txt /opt/app/requirements.txt
RUN pip3 install -r /opt/app/requirements.txt

COPY ./projects.thux.it /opt/app
COPY ./uwsgi.ini  /opt/app
COPY ./entrypoint /usr/local/bin/entrypoint

ENV PYTHONPATH=/opt/app:/opt/app/apps

WORKDIR /opt/app
ENTRYPOINT ["entrypoint"]
EXPOSE 8000

#CMD ["--ini", "/opt/app/uwsgi.ini"]

entrypoint这里有一个脚本,用于检测在所有其他情况下是调用uwsgi(在没有参数的情况下)还是调用python manage。 我想将这个容器既用作可执行文件(dj migrate,dj shell,…-dj这里是python manage.py,用于django交互的处理程序),又用作长期容器(uwsgi--ini uwsgi.ini)。我使用docker compose,如下所示:

web:
    image: thux-projects:3.5
    build: .
    ports:
      - "8001:8000"
    volumes:
      - ./projects.thux.it/web/settings:/opt/app/web/settings
      - ./manage.py:/opt/app/manage.py
      - ./uwsgi.ini:/opt/app/uwsgi.ini
      - ./logs:/var/log/django

事实上,我设法正确地为项目服务,但与django互动以“检查”我需要发布:

docker compose exec web入口点检查

在阅读文档时,我会想象我只需要这些参数(没有entrypoint

Command line arguments to docker run will be appended after all elements in an exec form ENTRYPOINT, and will override all elements specified using CMD. This allows arguments to be passed to the entry point, i.e., docker run -d will pass the -d argument to the entry point.

具有“重复”入口点的工作情况:

$ docker-compose exec web entrypoint check
System check identified no issues (0 silenced).

如果我避开“入口点”,失败的是:

$ docker-compose exec web check
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"check\": executable file not found in $PATH": unknown

Tags: todjangocomposedockerwebappmanageuwsgi
1条回答
网友
1楼 · 发布于 2024-10-03 17:17:50

docker exec从不使用容器的入口点;它只是直接运行你给它的命令

当您docker run一个容器时,您给出的入口点和启动它的命令是combined以生成单个命令行,并且该命令成为主容器进程。另一方面,当您在运行的容器中^{}一个命令时,它会被逐字解释;命令行中没有两个部分需要组装,并且根本不考虑容器的入口点

对于您描述的用例,您不需要一个entrypoint脚本以一种不同寻常的方式处理命令。您可以创建到manage.py脚本的符号链接,以提供一个较短的别名来运行它,但将默认命令设置为uwsgi运行程序

RUN chmod +x manage.py
RUN ln -s /opt/app/manage.py /usr/local/bin/dj
CMD ["uwsgi", " ini", "/opt/app/uwsgi.ini"]
# Runs uwsgi:
docker run -p 8000:8000 myimage

# Manually trigger database migrations:
docker run  rm myimage dj migrate

相关问题 更多 >