gpt4 book ai didi

docker - 在 Dockerfile 中使用控制台输出

转载 作者:行者123 更新时间:2023-12-05 00:11:02 25 4
gpt4 key购买 nike

我想使用一些控制台输出作为我的基本 docker 镜像的名称。

具体来说,我有一个依赖的 docker 构建文件链,所以我试图自动化这个过程。例如,一个图像的 Dockerfile derived1取决于基础镜像 base_image_name在以下场景中:

base_image_name/ 
Dockerfile
derived1/
Dockerfile
derived2/
Dockerfile

构建基础镜像时,它会使用 ${PWD##*/} 从当前文件夹中获取其名称。 .在这种情况下,基本图像的文件夹称为 base_image_name ,因此基本图像称为 company:base_image_name .

然后,当派生镜像构建时,他们应该能够通过向上移动目录并查看该目录名称来找出基本镜像的名称。例如,当构建 company:derived1 时镜像构建,它应该查找一个目录,看到它被称为 base_image_name ,并由此推断它应该使用基本图像 company:base_image_name .

我想让这个结构有几层深,所以我想自动化它。为此,我尝试了几种语法排列
FROM company:$(cd $PWD/../;  echo ${PWD##*/})

但我似乎无法正确理解。了解什么命令 $(cd $PWD/../; echo ${PWD##*/})正在做,只需在您的终端中输入它..
echo $(cd $PWD/../;  echo ${PWD##*/})

简单地返回上一级目录的名称。但是,当我尝试在 Dockerfile 中使用它时,出现错误
Error response from daemon: Dockerfile parse error line 1: FROM requires either one or three arguments

有人可以为我提供正确的语法吗?

编辑:

我还尝试使用 build-arg 构建派生图像,但这似乎也不起作用:
build.sh:

BASE=$(cd $PWD/../../; echo ${PWD##*/})
echo "BASE="$BASE
docker build --build-arg BASE=${BASE} -t company:"${PWD##*/}" .

Dockerfile 的样子
FROM company:$BASE

具体来说,这会产生构建错误:
BASE=base_image_name
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM company:$BASE
invalid reference format

因此,docker 似乎没有正确解释构建 arg。

最佳答案

Dockerfiles 一般不支持 shell 语法,除了一些 very limited environment variable expansion .

他们确实支持 ARG可以从命令行传入的 s,以及 an ARG can be used to define the image FROM .所以你可以用

ARG tag
FROM company:${tag:-latest}

然后用
docker build --build-arg tag=$(cd $PWD/../;  echo ${PWD##*/}) .

(涉及到足够多的内容,您可能想将其写入 shell 脚本)。

在非常低的级别上,还值得记住的是 docker build它的工作原理是制作当前目录的 tar 文件,通过 HTTP 连接将其发送到 Docker 守护程序,然后在那里运行构建。一旦该过程发生,主机目录名称的任何概念都将丢失。换句话说,即使语法有效, docker build也无法知道 Dockerfile 所在的主机目录。

关于docker - 在 Dockerfile 中使用控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54924693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com