该行为由docker或podman用于向构建过程呈现文件的上下文目录提供。这里有一个很好的技巧,就是在构建指令期间将上下文dir更改为要向守护进程公开的目录的完整路径。例如:
docker build -t imageName:tag -f /path/to/the/Dockerfile /mysrc/path
使用/myrc/path代替。(当前目录),您将使用该目录作为上下文,因此构建过程可以看到该目录下的任何文件。在这个示例中,您将向docker守护进程公开整个/myrc/path树。当使用docker时,触发构建的用户ID必须具有从上下文目录递归读取任何单个目录或文件的权限。
如果您有/home/user/myCoolProject/Dockerfile,但希望将不在同一目录中的文件带到此容器构建上下文中,这可能非常有用。
这里有一个使用上下文dir构建的示例,但这次使用podman而不是docker。
让我们以Dockerfile为例,在Dockerfile中有一个COPY或ADD指令,它从项目外部的目录中复制文件,例如:
FROM myImage:tag
...
...
COPY /opt/externalFile ./
ADD /home/user/AnotherProject/anotherExternalFile ./
...
为了构建这个,使用位于/home/user/myCoolProject/Dockerfile中的容器文件,只需执行以下操作:
cd /home/user/myCoolProject
podman build -t imageName:tag -f Dockefile /
更改上下文目录的一些已知用例是在使用容器作为工具链来构建源代码时。例如:
podman build --platform linux/s390x -t myimage:mytag -f ./Dockerfile /tmp/mysrc
或者它可以是路径相关的,例如:
podman build --platform linux/s390x -t myimage:mytag -f ./Dockerfile ../../
另一个使用这次全局路径的示例:
FROM myImage:tag
...
...
COPY externalFile ./
ADD AnotherProject ./
...
注意,现在Dockerfile命令层中省略了COPY和ADD的完整全局路径。在这种情况下,context目录必须相对于文件所在的位置,如果externalFile和AnotherProject都在/opt目录中,则用于构建它的context目录应为:
podman build -t imageName:tag -f ./Dockerfile /opt
在docker中将COPY或ADD与上下文目录一起使用时请注意:docker守护程序将尝试将上下文目录树上可见的所有文件“流式传输”到守护程序,这可能会降低构建速度。并要求用户具有上下文目录的递归权限。特别是在通过API使用构建时,这种行为的成本可能会更高。然而,使用podman,构建是即时进行的,不需要递归权限,这是因为podman不会枚举整个上下文目录,也不会使用客户端/服务器架构。当您使用不同的上下文目录来面对此类问题时,使用podman而不是docker来构建此类案例可能会更有趣。
一些参考文献:
https://docs.docker.com/engine/reference/commandline/build/https://docs.podman.io/en/latest/markdown/podman-build.1.html