docker поведение точки входа с django - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь сделать свой первый django контейнер с uwsgi. Он работает следующим образом:

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 -составить следующим образом:

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 exe c проверка точки входа в сеть

при чтении документов, которые я себе представлял, мне просто нужны аргументы (без entrypoint)

Аргументы командной строки к docker run будет добавлен после всех элементов в exe c form 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

1 Ответ

1 голос
/ 13 января 2020

docker exec никогда не использует точку входа контейнера; он просто запускает команду, которую вы ему даете.

Когда вы docker run контейнер, точка входа и команда, которую вы даете для его запуска, объединены , чтобы создать единую командную строку, и это Команда становится основным контейнерным процессом. С другой стороны, когда вы 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
...