COPY
指令与您构建此镜像的上下文紧密相关。
实际上,文档中已经指出:
docker build
命令从Dockerfile和“上下文”构建Docker镜像。构建的上下文是位于指定的PATH
或URL
中的文件集。构建过程可以引用上下文中的任何文件。例如,您的构建可以使用COPY
指令来引用上下文中的文件。
来源:https://docs.docker.com/engine/reference/commandline/build/#extended-description
尽管如此,我们通常会这样做:
docker build .
你必须明白,这个最后的点 .
,你肯定在某些情况下忘记提供它时,Docker会抱怨它,实际上是构建发生的实际上下文。
你不必强制使用 .
——也就是当前目录——作为你的上下文。
因此,你需要提供正确的上下文,这将是一个文件夹,它将是/src/Shared Settings
和包含你的Dockerfile的文件夹之间的共同祖先。
你可能会遇到一个大问题,因为 Shared Settings
文件夹只存在于 src
中,所以你能找到的唯一共同祖先可能会迫使你使用/
作为你的上下文,从而使你的上下文变得非常庞大,构建时间也会变得很长。
为了解决这个问题,你可以使用.dockerignore文件来忽略所有无关的文件夹,只使用你想要使用的那个文件夹,即/src/Shared Settings
和包含你的Dockerfile的文件夹。
另外,当你改变你的上下文时,请注意你需要调整这行代码:
COPY . .
现在将会显示:
COPY name_of_the_folder_containing_the_Dockerfile .
这里是一个示例,您需要根据实际文件夹层次结构进行调整。
这里是文件夹层次结构:
.
├── .dockerignore
└── src
├── docker
│ └── Dockerfile
└── shared_settings
└── foo.conf
在
Dockerfile 中:
FROM alpine
COPY src/shared_settings /etc/opt/app
WORKDIR /opt/app
COPY src/docker .
CMD ["ls","-l"]
这是文件
.dockerignore如何从上下文中排除文件夹
unrelated的内容:
**
!src/docker
!src/shared_settings
现在,我可以进入文件夹src/docker并使用以下命令进行构建:
docker build -f Dockerfile ../..
或者进入文件夹 / 并使用以下命令进行构建
docker build -f src/docker/Dockerfile .
唯一重要的是包含 Dockerfile 的文件夹和文件夹shared_settings 都应该是我的上下文的一部分。
COPY "/src/Shared\ Settings" /app
- James McPherson