如何在同一个项目中为不同的构建指定不同的.dockerignore文件?
如何在同一项目中为不同的构建指定不同的.dockerignore文件?
Docker 19.03提供了解决方案。
Docker客户端首先尝试加载
目前,使用此功能需要设置DOCKER_BUILDKIT=1环境变量。自1.25.0-rc3版以来,可以在docker compose中使用此标志,同时还需指定COMPOSE_DOCKER_CLI_BUILD=1。
请参阅comment0,comment1,comment2。
请注意,自定义的dockerignore文件应位于与Dockerfile相同的目录中,而不是根上下文目录中,就像原始的.dockerignore文件一样。
即在调用DOCKER_BUILDKIT=1 docker build -f /path/to/custom.Dockerfile ...时,您的.dockerignore文件应位于/path/to/custom.Dockerfile.dockerignore。
请注意,自定义的dockerignore文件应位于与Dockerfile相同的目录中,而不是根上下文目录中,就像原始的.dockerignore文件一样。如果Dockerfile位于上下文的子目录中,那么docker ignore中的路径是否相对于Dockerfile的位置呢?令人惊讶的是,不是的,它们是相对于上下文位置的。
我尝试过这个方法,但在使用docker-compose时它不起作用。
如果在Dockerfile中使用实验性语法,这将无法工作:# syntax = docker/dockerfile:1.0-experimental
对于需要使用“-f -”进行脚本构建的情况呢?一个标志似乎是最简单的解决方法;如果我们可以使用“-i dockerignore-fifo”将会很好。
可能不会实现,因为Docker开发人员与社区合作不佳。查看这个问题。已经过去7年了...
原文链接:https://stackoverflow.com/questions/40904409#comment104372598_57774684
目前还没有办法实现这一点。关于在Docker中添加一个--ignore
标志以提供要使用的忽略文件的讨论正在进行中 - 请参见这里。
目前你有的选项大多是不太好的:
- 将项目拆分为具有自己的
Dockerfile
和.dockerignore
的子目录,这在你的情况下可能行不通。 - 创建一个脚本,将相关文件复制到临时目录并在那里运行Docker构建。
似乎还有很多其他选项。也许太多了。一个选项是将不想在构建中使用的文件临时移动到一个被忽略的目录中(我认为这甚至会减少上下文的大小)。另一个选项是创建一个tarball添加到镜像中(这对上下文的大小没有帮助)。另一个选项是有备用的忽略文件,并根据需要将它们移动到.docker_ignore
名称中。
在同一个项目中,如何为不同的构建指定不同的.dockerignore文件?
出现的原因:
- 在构建Docker镜像时,有时候希望根据不同的构建需求,忽略一些特定的文件或目录。但是默认情况下,Docker会使用项目根目录下的.dockerignore文件来忽略不需要包含在镜像中的文件。
- 然而,在同一个项目中,有时候需要为不同的构建指定不同的.dockerignore文件,以便忽略不同的文件或目录。
解决方法:
- 使用docker-compose:
- 在docker-compose.yml文件中,定义一个服务(例如tests),并使用volumes指令将包含测试代码的源代码目录挂载到容器中。
- 这样,在构建镜像后,当运行用于测试的容器时,挂载的源代码目录将覆盖清理后的代码。
- 使用docker build:
- 使用docker build命令时,可以使用-v参数来指定源代码目录的挂载。
- 需要将路径设置为"`pwd`/app:/opt/app",其中`pwd`表示当前目录,app为源代码目录,/opt/app为容器内的目录。
- 这样,在构建镜像后,可以使用docker run命令来运行容器,并将源代码目录挂载到容器中,实现与docker-compose相同的效果。
- 当需要为同一个项目的不同构建指定不同的.dockerignore文件时,可以通过docker-compose或docker build来实现。
- 使用docker-compose时,在docker-compose.yml文件中定义一个服务,并使用volumes指令将包含特定文件或目录的源代码目录挂载到容器中。
- 使用docker build时,可以在构建镜像时使用-v参数来指定源代码目录的挂载。通过将路径设置为"`pwd`/app:/opt/app",实现与docker-compose相同的效果。