Что я должен поставить для Docker CMD и ENTRYPOINT для приложения Flask, выполняющего «python myapp.py images / *» - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь запустить приложение Flask с помощью Docker. Обычно, чтобы запустить приложение Flask, я запускаю это в моем терминале:

python myapp.py images/*

Я не уверен, как преобразовать это в синтаксис Docker CMD (или если мне нужно отредактировать ENTRYPOINT).

Вот мой файл докера:

RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential hdf5-tools
COPY . ~/myapp/
WORKDIR ~/myapp/
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["myapp.py"]

Внутри Required

flask
numpy
h5py
tensorflow
keras

Когда я запускаю образ докера:

person@person:~/Projects/$ docker run -d -p 5001:5000 myapp
19645b69b68284255940467ffe81adf0e32a8027f3a8d882b7c024a10e60de46

Докер PS:

Up 24 seconds       0.0.0.0:5001->5000/tcp   hardcore_edison

Когда я дошел до localhost: 5001, я не получил ответа. Это проблема с моим параметром CMD?

EDIT: Новый Dockerfile:

RUN apt-get update -y
RUN apt-get install -y python-pip python-dev build-essential hdf5-tools
COPY . ~/myapp/
WORKDIR ~/myapp/
EXPOSE 5000
RUN pip install -r requirements.txt
CMD ["python myapp.py images/*.jpg "]

С этой новой конфигурацией при запуске:

docker run -d -p 5001:5000 myapp

Я получаю:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"python myapp.py images/*.jpg \": stat python myapp.py images/*.jpg : no such file or directory": unknown.

Когда я бегу:

docker run -d -p 5001:5000 myapp python myapp.py images/*.jpg

Я запускаю образ Docker, но теперь, когда я захожу на localhost: 5001, он жалуется, что соединение было сброшено.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Одна проблема, которую я обнаружил, заключалась в том, что приложение было недоступно для Docker. Я добавил это в app.run:

host='0.0.0.0'

Согласно этому: Развертывание приложения минимальной фляги в докере - проблемы с подключением к серверу

Далее Docker паникует, когда вы добавляете каталог к ​​параметрам CMD. Итак, я удалил ENTRYPOINT и CMD и вручную добавил команду для запуска Docker:

docker docker run -d -p 5001:5000 myappdocker python myapp.py images/*.jpg
0 голосов
/ 29 августа 2018

Я рад, что вы уже решили эту проблему. Я отвечаю на этот вопрос только для тех, у кого все еще такие же заблуждения, что и у вас с ENTRYPOINT и CMD руководителями.
В Dockerfile ENTRYPOINT и CMD являются двумя похожими руководителями, но между ними все еще есть сильная разница. Наиболее важным (только мне кажется) является то, что CMD может быть перезаписано, но ENTRYPOINT нет.
Чтобы объяснить это, я могу предложить вам, ребята, командный удар:
docker run -tid --name=container_name image_name [command]
Как мы видим, command является необязательным, и он (если существует) может перезаписать CMD, определенный в Dockerfile.
Вернемся к вашей проблеме. У вас может быть два пути для достижения вашей цели ->

  1. ENTRYPOINT ["python"] и CMD ["/path/to/myapp.py", "/path/to/images/*.jpg"].
  2. CMD python /path/to/myapp.py /path/to/images/*.jpg. Об этом упоминает @David Maze выше.

Чтобы понять первый, вы можете взять CMD в качестве аргументов для ENTRYPOINT.

Простой пример ниже.

Dockerfile ->
FROM ubuntu:18.04 ENTRYPOINT ["cat"] CMD ["/etc/hosts"]

Создайте образ с именем test-cmd-show и запустите из него контейнер.
docker run test-cmd-show
Это покажет содержимое в /etc/hosts файле. И продолжай ...
docker run test-cmd-show /etc/resolv.conf
И это покажет нам содержимое файла /etc/resolv.conf. И продолжай ...
docker run test-cmd-show --help
Это покажет справочную информацию для команды cat.

Фантастика, верно?
Так или иначе, мы могли бы сделать больше исследований, хотя эта функциональность.

Добавить соответствующий вопрос: В чем разница между CMD и ENTRYPOINT ?

0 голосов
/ 28 августа 2018

Важно то, что вам нужна оболочка для расширения командной строки, поэтому я бы написал

CMD python myapp.py images/*

Когда вы просто пишете CMD, как это (без скобок и кавычек, которые не совсем JSON), Docker неявно пропускает командную строку через оболочку.

(Вы также можете подумать о том, чтобы изменить свое приложение, чтобы оно поддерживало использование имени каталога в качестве конфигурации в некоторой форме и «вставку его» в ваше приложение, если эти образы будут находиться в фиксированном месте в файловой системе контейнера.)

Я бы установил ENTRYPOINT только тогда, когда (a) вы устанавливаете его для сценария оболочки-обертки, который выполняет некоторую первоначальную настройку, а затем exec "$@"; или (b) когда у вас есть FROM scratch изображение со статическим двоичным файлом, и вы буквально не можете ничего сделать с контейнером, кроме запуска одного двоичного файла в нем.

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