我可以将目录从 docker 区域以外的某个位置复制到我的 docker 文件吗?
Can I copy a directory from some location outside the docker area to my dockerfile?
我已经通过 Dockerfile
中的 requirements.txt
文件安装了一个名为 fastai==1.0.59
的库。
但是运行Django app因为一个错误没有达到目的。为了解决这个错误,我需要手动编辑这个库文件夹中的文件 /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.
我试过引用这个:How to include files outside of Docker's build context?
但似乎它从我的头上反弹了一点..
请帮我解决这个问题。谢谢。
Docker 文件:
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
简答
没有
长答案
当您 运行 docker build
当前目录及其所有内容(子目录和所有内容)被复制到名为 'build context' 的临时区域中。当您在 Dockerfile 中发出 COPY
指令时,docker 将从暂存区复制到图像文件系统中的一个层中。
如您所见,这会阻止从构建上下文之外的目录复制文件。
解决方法
要么在构建过程中从他们的 golden-source 直接下载你想要的文件到镜像中(这就是为什么你经常在 Dockerfiles 中看到很多 curl
语句),或者你可以复制文件(目录)您需要进入构建树并将它们作为项目的一部分签入源代码管理。您选择哪种方法完全取决于您的项目性质和您需要的文件。
备注
为此记录了其他变通方法,所有这些变通方法无一例外地破坏了您构建的 'portability' 的意图。唯一优质的解决方案是此处记录的解决方案(如果我遗漏了任何保持可移植性的解决方案,我很乐意将其添加到此列表中)。
我已经通过 Dockerfile
中的 requirements.txt
文件安装了一个名为 fastai==1.0.59
的库。
但是运行Django app因为一个错误没有达到目的。为了解决这个错误,我需要手动编辑这个库文件夹中的文件 /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.
我试过引用这个:How to include files outside of Docker's build context? 但似乎它从我的头上反弹了一点..
请帮我解决这个问题。谢谢。
Docker 文件:
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
简答
没有
长答案
当您 运行 docker build
当前目录及其所有内容(子目录和所有内容)被复制到名为 'build context' 的临时区域中。当您在 Dockerfile 中发出 COPY
指令时,docker 将从暂存区复制到图像文件系统中的一个层中。
如您所见,这会阻止从构建上下文之外的目录复制文件。
解决方法
要么在构建过程中从他们的 golden-source 直接下载你想要的文件到镜像中(这就是为什么你经常在 Dockerfiles 中看到很多 curl
语句),或者你可以复制文件(目录)您需要进入构建树并将它们作为项目的一部分签入源代码管理。您选择哪种方法完全取决于您的项目性质和您需要的文件。
备注
为此记录了其他变通方法,所有这些变通方法无一例外地破坏了您构建的 'portability' 的意图。唯一优质的解决方案是此处记录的解决方案(如果我遗漏了任何保持可移植性的解决方案,我很乐意将其添加到此列表中)。