Docker-контейнер не запускается, ошибка: python3: не удается открыть файл 'flask run --host = 0.0.0.0': [Errno 2] Нет такого файла или каталога - PullRequest
1 голос
/ 26 марта 2019

Я новичок в докере и пытаюсь докеризировать микросервис с питоном.Файл Docker успешно создается, но при запуске контейнера выдает ошибку:

python3: can't open file 'flask': [Errno 2] No such file or directory

Я предполагаю, что в моем файле Docker есть какая-то ошибка в пути COPY, ENTRYPOINT или CMD, то есть в командах, которые я используюзапустить приложение колбу.Я не могу понять ошибку.

Структура каталогов на машине с Ubuntu:

/home/ubuntu/Docker/auth

В аутентификации каталогов содержится мой Dockerfile и все другие файлы флешек Python:

$ls 
Dockerfile   run.py    views.py     resources.py    models.py

run.py - основной файл флакона Python для выполнения.Я уверен, что есть некоторая синтаксическая ошибка в том, как я выполняю команду CMD для приложения колбы, и он не может найти run.py для выполнения.Я не могу исправить эту ошибку.

Образ строится успешно.Для запуска контейнера я использую:

docker build <imageid>

Dockerfile

FROM ubuntu:16.04

MAINTAINER xyz <xyz@yahoo.com>

RUN apt-get update \
    && apt-get install -y software-properties-common vim \
    && add-apt-repository ppa:jonathonf/python-3.6 \
    && apt-get update -y \
    && apt-get install -y build-essential python3.6 python3.6-dev python3-pip 
       python3.6-venv \
    && pip3 install --upgrade pip

WORKDIR /auth
COPY . /auth

RUN pip3 install alembic==0.9.9 \
    && pip3 install Flask==1.0.2 \

ENTRYPOINT [ "python3" ]
CMD [ "export","FLASK_APP=run.py" ]
CMD [ "set", "FLASK_APP=run.py" ]
CMD [ "flask", "run", "--host=0.0.0.0" ]

Ожидается: приложение должно работать на контейнере.Факт: Python3: невозможно открыть файл 'flask': [Errno 2] Нет такого файла или каталога

1 Ответ

0 голосов
/ 26 марта 2019

Лучшее использование для ENTRYPOINT - установить основную команду изображения, позволяя запускать это изображение, как если бы оно было этой командой (а затем использовать CMD в качестве флагов по умолчанию).

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint

многие люди упускают этот момент из-за инструкций ENTRYPOINT и CMD Dockerfile.

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

CMD должен включать флаги, предоставленные этому исполняемому файлу, чтобы их можно было легко переопределить при запуске контейнера.

Я не уверен, что у вас должно быть более одной CMD инструкции.если вам нужно запускать команды во время процесса сборки, вы можете использовать инструкцию RUN - например:

RUN mkdir some/dir

сейчас:

run.py - это основной файл флакона Python для выполнения

, поэтому я предлагаю вам определить его как точку входа:

ENTRYPOINT [ "./run.py" ]

команды, которые вы также можете запускать каждый раз, когда контейнерзапускает, например flask run --host=0.0.0.0, вы можете:

  • переместить эту команду, чтобы она находилась внутри run.py файла

    или

  • держите линию CMD [ "flask", "run", "--host=0.0.0.0" ].эта команда будет передана в качестве аргумента точке входа run.py, поэтому вы можете выполнить ее там.таким образом, вы можете легко переопределить команду при запуске контейнера с альтернативными аргументами.

Этот материал также находится в документах :

Понять, как взаимодействуют CMD и ENTRYPOINT

Инструкции CMD и ENTRYPOINT определяют, какая команда выполняется при запуске контейнера.Есть несколько правил, которые описывают их взаимодействие.

В Dockerfile должна быть указана хотя бы одна из команд CMD или ENTRYPOINT.

ENTRYPOINT следует определять при использовании контейнера в качестве исполняемого файла.

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

CMD будет переопределен при запуске контейнера с альтернативными аргументами.

...