Команда добавления Pycharm - PullRequest
0 голосов
/ 20 марта 2020

Pycharm Professional 2019.3

Ubuntu 18.04

Я хочу отладить скрипт python в контейнере. Я знаю, что приведенный ниже пример является излишним, но я хочу сделать его максимально простым. Как добавить точку входа в Dockerfile?

docker -compose.yml:

version: '3'
services:
    python:
        build: .
        container_name: ppd

Dockerfile:

RUN apt-get update
RUN apt-get install -y --no-install-recommends \
    python3-pip
ENTRYPOINT ["sleep", "5"]

app.py:

from time import sleep
for i in [1, 2, 3, 4, 5]:
    sleep(2)
    print(i)

I на основе pycharm configure

enter image description here enter image description here

Если я запускаю проект без ENTRYPOINT, все работает нормально:

enter image description here

docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd ppd "python3 -u /opt/project/build/app.py"

Похоже, что pycharm дает команду CMD, потому что когда я добавляю CMD в app.py, он игнорируется docker.

Когда я добавляю ENTRYPOINT в app.py и запускаю контейнер, я вижу : enter image description here

docker ps -a --no-trunc --format {{.Names}}{{.Command}} | grep ppd ppd "sleep 5 python3 -u /opt/project/build/app.py"

Как объединить ENTRYPOINT в Dockerfile с pycharm CMD?

1 Ответ

1 голос
/ 20 марта 2020

Если вы измените ENTRYPOINT на CMD в вашем Dockerfile, все будет работать нормально.

ENTRYPOINT не является обязательной командой в Dockerfile. Как правило, вам нужен хотя бы один из ENTRYPOINT или CMD, но нет конкретных требований c для использования одного или другого. Если вы укажете оба параметра, CMD будет передано в качестве дополнительных аргументов ENTRYPOINT.

Например, в docker run очень просто переопределить CMD, когда вы создаете контейнер:

docker run --rm myimage \
  python app.py
docker run --rm myimage \
  ls -lrt /app

Это похоже на то, что делает PyCharm тоже; он также соответствует параметру command: в Docker Compose.

Так как командная часть просто добавляется к части точки входа, указание ENTRYPOINT, как вы показали, может вызвать некоторое странное поведение, и вам нужно некоторые неловкие обходные пути.

 # ENTRYPOINT ["sleep", "5"]

 # sleep 5 python myapp.py
 docker run --rm myimage \
   python myapp.py

 # actually runs "python myapp.py" without the "sleep" wrapper
 docker run --rm \
   --entrypoint python \
   myimage \
   myapp.py \

Этот шаблон означает несколько вещей:

  • CMD, как правило, должна представлять собой полную командную строку; вы должны ожидать, что он может быть заменен во время запуска контейнера.
  • Если вы предоставите ENTRYPOINT, вы должны обязательно запустить CMD, который передается в качестве аргументов. Если это сценарий оболочки, то для этого нужно добавить exec "$@".
  • Предпочитайте CMD ENTRYPOINT, если вы не уверены, какой из них использовать (и не используете оба).
  • Если ваша программа имеет сложный вызов, рассмотрите возможность ее оборачивания в сценарий оболочки, чтобы ее можно было легко запустить со стандартным набором аргументов.
FROM python:3.8
WORKDIR /app
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
RUN chmod +x app.py

# No entrypoint; easy to specify an alternate command
CMD ["./app.py"]
# Entrypoint is a wrapper tool that takes a command as options
ENTRYPOINT ["wait-for-it.sh", "db:5432", "--"]
CMD ["./app.py"]
# Entrypoint is a shell script ending in `exec "$@"`
ENTRYPOINT ["./entrypoint.sh"]
CMD ["./app.py"]

(Существует альтернативный шаблон «контейнер как команда», где ENTRYPOINT - полная команда, а CMD - это опции, предоставляемые вызывающим абонентом; в документации Docker есть пример . не работает с настройкой PyCharm, которую вы описываете.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...