Монтировать внешние файлы в контейнер Docker

#python-3.x #docker

#python-3.x #docker

Вопрос:

У меня есть приложение для прогнозирования с приведенной ниже структурой папок:

 Docker
├── dataset
│   └── fastText
│       └── crawl-300d-2M.vec
├── Dockerfile
├── encoder
│   └── sentencoder2.pkl
├── pyt_models
│   └── actit1.pt
├── requirements.txt
└── src
    ├── action_items_api.py
    ├── infer_predict.py
    ├── model.py
    ├── models.py
    └── sent_enc.py
  

Dockerfile:

 FROM python:3.6

EXPOSE 80


# copy and install packages for flask

COPY /requirements.txt /tmp/
RUN cd /tmp amp;amp; 
    pip3 install --no-cache-dir -r ./requirements.txt


WORKDIR /Docker

COPY src src

CMD gunicorn -b 0.0.0.0:80 --chdir src action_items_api:app
  

В файле Docker я пытаюсь скопировать только папку src, в которой размещены все файлы Python. Я хочу, чтобы самые быстрые, ecnode, pyt_models были доступны за пределами контейнера.

Когда я попытался:

 docker run -p8080:80 -v /encoder/:/encoder/;/pyt_models/:/pyt_models/;/dataset/:/dataset/ -it actit_mount:latest
  

Но, делая это, мой код дает мне FileNotFoundError No such file or directory: 'encoder/sentencoder2.pkl'

Но сохраняя ту же структуру папок, если я запускаюсь из папки docker: gunicorn --chdir src --bind 0.0.0.0:80 action_items_api:app Это работает.

Что не так с Dockerfile или docker run ?

Комментарии:

1. Команда run определенно неверна. Для исправления нам нужно знать, на какой ОС вы пытаетесь это сделать.

2. @Henry Ubuntu 18.04

Ответ №1:

Поскольку вы установили WORKDIR /Docker , для процесса gunicorn будет установлен рабочий каталог, равный /Docker . Это означает, что относительные пути к файлам в вашем приложении python будут разрешены из /Docker .

Попробуйте

 docker run -p8080:80  
  -v $(pwd)/encoder/:/Docker/encoder/ 
  -v $(pwd)/pyt_models/:/Docker/pyt_models/ 
  -v $(pwd)/dataset/:/Docker/dataset/ 
  -it actit_mount:latest
  

Ответ №2:

docker: ответ об ошибке от daemon: create ./folder: «./папка» содержит недопустимые символы для имени локального тома, разрешены только «[a-zA-Z0-9][a-zA-Z0-9_.-]». Если вы намеревались передать каталог узла, используйте абсолютный путь.

Вот пример:

пример запуска docker -v