【问题标题】:docker entrypoint behaviour with djangodjango 的 docker 入口点行为
【发布时间】:2020-01-12 23:49:34
【问题描述】:

我正在尝试使用 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.尼)。我使用 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

docker run 的命令行参数将附加在后面 exec 形式 ENTRYPOINT 中的所有元素,并将覆盖所有元素 使用 CMD 指定的元素。这允许将参数传递给 入口点,即 docker run -d 将传递 -d 参数 到入口点。

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

$ 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

【问题讨论】:

  • ENTRYPOINT 仅在docker run 时间构建命令行时有效,在通过docker exec 启动调试命令时无效。
  • 好收获!谢谢。如果你把它变成一个答案,我会很高兴“接受”它..

标签: python django docker docker-compose uwsgi


【解决方案1】:

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

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

对于您描述的用例,您不需要入口点脚本来以不寻常的方式处理命令。您可以创建指向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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多