Когда вы
docker run -p 5000:5000 my-api-docker ~/Desktop/myApiDocker
Docker интерпретирует все после имени образа (my-api-docker
) как команду для запуска. Он запускает /Users/name/Desktop/myApiDocker
как команду, вместо , что у вас есть как CMD
в Dockerfile, и когда этот путь не существует в контейнере, вы получаете сообщение об ошибке.
Маловероятно, что вы сможете передать этот путь вашей команде flask run
в качестве аргумента командной строки. Типичный способ справиться с этим - использовать вместо этого переменную окружения. В вашем коде
download_dir = os.environ.get('DOWNLOAD_DIR', '.')
currencies_xml = os.path.join(download_dir, 'currencies.xml')
with open(currencies_xml, 'wb') as file:
...
Затем, когда вы запускаете свой контейнер, вы можете передать это как переменную окружения с опцией docker run -e
. Обратите внимание, что это имя пути внутри контейнера;для этого нет особой необходимости совпадать с путем на хосте.
docker run \
-p 5000:5000 \
-e DOWNLOAD_DIR=/data \
-v $HOME/Desktop/myApiDocker:/data \
my-api-docker
Также довольно распространено помещать оператор ENV
в ваш файл Docker или иным образом выбирать фиксированный путь для этого и просто указывать, чтоИнтерфейс вашего образа состоит в том, что он загружает файл во все, что смонтировано на /data
.