Если вы измените 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, которую вы описываете.)