Могу ли я скопировать каталог из какого-либо места за пределами области docker в мой dockerfile? - PullRequest
0 голосов
/ 23 марта 2020

Я установил библиотеку с именем fastai==1.0.59 через requirements.txt файл внутри моего Dockerfile.

Но цель запуска приложения Django не достигается из-за одной ошибки. Чтобы устранить эту ошибку, мне нужно вручную отредактировать файлы /site-packages/fastai/torch_core.py и site-packages/fastai/basic_train.py внутри этой папки библиотеки, которые я не собираюсь.

Поэтому я пытаюсь скопировать саму папку fastai от моего хост-компьютера до местоположения внутри docker изображения.

исходное местоположение: /Users/AjayB/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/fastai/

место назначения: ../venv/lib/python3.6/site-packages/, которое находится внутри моего docker изображения.

будучи новичком в docker, я попробовал это, используя команду COPY, например: COPY /Users/AjayB/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/fastai/ ../venv/lib/python3.6/site-packages/

, которая выдала мне ошибку:

ERROR: Service 'app' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder583041406/Users/AjayB/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/fastai: no such file or directory.

Я попытался сослаться на это: Как включить файлы вне контекста сборки Docker? , но кажется, что это немного отразилось в моей голове ..

Пожалуйста, помогите мне решить эту проблему. Спасибо.

Dockerfile:

FROM python:3.6-slim-buster AS build
MAINTAINER model1
ENV PYTHONUNBUFFERED 1


RUN python3 -m venv /venv
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y git && \
    apt-get install -y build-essential && \
    apt-get install -y awscli && \
    apt-get install -y unzip && \
    apt-get install -y nano && \
    apt-get install -y libsm6 libxext6 libxrender-dev


RUN apt-cache search mysql-server
RUN apt-cache search libmysqlclient-dev
RUN apt-get install -y libpq-dev
RUN apt-get install -y postgresql
RUN apt-cache search postgresql-server-dev-9.5
RUN apt-get install -y libglib2.0-0

RUN mkdir -p /model/
COPY . /model/
WORKDIR /model/

RUN pip install --upgrade awscli==1.14.5 s3cmd==2.0.1 python-magic
RUN pip install -r ./requirements.txt

EXPOSE 8001

RUN chmod -R 777 /model/

COPY /Users/AjayB/anaconda3/envs/MyDjangoEnv/lib/python3.6/site-packages/fastai/ ../venv/lib/python3.6/site-packages/

CMD python3 -m /venv/activate
CMD /model/my_setup.sh development
CMD export API_ENV = development
CMD cd server && \
    python manage.py migrate && \
    python manage.py runserver 0.0.0.0:8001

1 Ответ

2 голосов
/ 23 марта 2020

Короткий ответ

Нет

Длинный ответ

При запуске docker build текущий каталог и все его содержимое (подкаталоги и все) копируется в промежуточную область, называемую «контекстом сборки». Когда вы запускаете инструкцию COPY в Dockerfile, docker будет копировать из промежуточной области в слой в файловой системе изображения.

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

Обходной путь

Либо загружайте нужные файлы из их золотого источника прямо в изображение во время процесса сборки (вот почему вы часто видите много curl операторов в Dockerfiles), или вы можете скопировать нужные файлы (dirs) в дерево сборки и включить их в систему контроля версий как часть вашего проекта. Какой метод вы выберете, полностью зависит от характера вашего проекта и необходимых вам файлов.

Примечания

Для этого задокументированы другие обходные пути, все они без Исключение нарушает намерение «переносимости» вашей сборки. Единственными качественными решениями являются те, что задокументированы здесь (хотя я с удовольствием добавлю в этот список, если я пропустил какие-либо, которые сохраняют переносимость).

...