我想使用一些控制台输出作为我的基本 docker 映像的名称。
具体来说,我有一个依赖的 docker 构建文件链,所以我试图自动化这个过程。例如,在以下场景中,一个镜像的 Dockerfilederived1依赖于基础镜像base_image_name:
base_image_name/
Dockerfile
derived1/
Dockerfile
derived2/
Dockerfile
Run Code Online (Sandbox Code Playgroud)
构建基础映像时,它会使用${PWD##*/}. 在这种情况下,基本图像的文件夹称为base_image_name,因此基本图像称为company:base_image_name。
然后,当派生映像构建时,他们应该能够通过向上移动目录并查看该目录名称来找出基本映像的名称。因此,例如,当构建company:derived1镜像时,它应该查找一个目录,看到它被调用base_image_name,并由此推断它应该使用基础镜像company:base_image_name。
我想让这个结构有几层深,所以我想自动化它。为此,我尝试了几种语法排列
FROM company:$(cd $PWD/../; echo ${PWD##*/})
Run Code Online (Sandbox Code Playgroud)
但我似乎无法正确理解。要了解该命令$(cd $PWD/../; echo ${PWD##*/})在做什么,只需在终端中输入它即可。
echo $(cd $PWD/../; echo ${PWD##*/})
Run Code Online (Sandbox Code Playgroud)
简单地返回上一级目录的名称。但是,当我尝试在 Dockerfile 中使用它时,出现错误
Error response from daemon: Dockerfile parse error line 1: FROM requires either one or three arguments
Run Code Online (Sandbox Code Playgroud)
有人可以为我提供正确的语法吗?
编辑:
我还尝试使用 a 构建派生图像build-arg,但这似乎也不起作用:
build.sh:
BASE=$(cd $PWD/../../; echo ${PWD##*/})
echo "BASE="$BASE
docker build --build-arg BASE=${BASE} -t company:"${PWD##*/}" .
Run Code Online (Sandbox Code Playgroud)
Dockerfile 的样子
FROM company:$BASE
Run Code Online (Sandbox Code Playgroud)
具体来说,这会产生构建错误:
BASE=base_image_name
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM company:$BASE
invalid reference format
Run Code Online (Sandbox Code Playgroud)
因此,docker 似乎没有正确解释构建 arg。
Dockerfiles 一般不支持 shell 语法,除了一些非常有限的环境变量扩展。
它们确实支持ARG可以从命令行传入的 s ,并且可以使用sARG来定义图像FROM。所以你可以用以下命令启动你的 Dockerfile
ARG tag
FROM company:${tag:-latest}
Run Code Online (Sandbox Code Playgroud)
然后构建图像
docker build --build-arg tag=$(cd $PWD/../; echo ${PWD##*/}) .
Run Code Online (Sandbox Code Playgroud)
(它涉及的内容足够多,您可能想将其写入 shell 脚本中)。
在非常低的级别上,还值得记住的是,它的docker build工作原理是创建当前目录的 tar 文件,通过 HTTP 连接将其发送到 Docker 守护程序,然后在那里运行构建。一旦该过程发生,主机目录名称的任何概念都会丢失。换句话说,即使语法有效,docker build也无法知道 Dockerfile 位于哪个主机目录中。
| 归档时间: |
|
| 查看次数: |
5276 次 |
| 最近记录: |