如何将文件作为 dockerfile 的参数传递

如何将文件作为 dockerfile 的参数传递

实际上,我不确定这是否可以做到,但我知道总会有黑客攻击,所以我很想知道各位专家对此有何看法。

我想在构建我的 docker 镜像时传递一个包作为参数,以便我可以使用相同的 dockerfile 部署不同的应用程序版本。

这是我想要实现的一个例子:
在构建图像时将包作为参数传递的能力(我知道语法是错误的,这只是一个例子)

 docker build -t myapp/myapp:v1 . package_myapp_v1.tar  

然后使用ADDDockerfile其提取到容器中。

ADD passed_package ./ 

因此,如果我想为我的应用程序的 v2 构建一个图像,我只需在docker build命令中指定新的包,而无需更改Dockerfile

有谁知道让它发挥作用的诀窍是什么?

谢谢 :)

答案1

我花了两分钟阅读后解决了这个问题docker 的文档

ARG 指令定义了一个变量,用户可以在构建时使用 --build-arg = 标志通过 docker build 命令将该变量传递给构建器。如果用户指定了 Dockerfile 中未定义的构建参数,构建将输出错误。

所以我用它来塑造我的形象

docker build -t myapp/v1 --build-arg package=package_myapp_v1.tar.gz .

然后获取包里面的Dockerfile使用ARG指令:

ARG package
ADD $package ./

$package变量的内容是package_myapp_v1.tar.gz通过标签传递的package

答案2

看起来应该是上下文在构建之间发生变化,而不是 Dockerfile,对吗?无论如何,实现这一点的一种方法是使用 Docker 的功能将上下文作为 tar(可选 gz)文件接收,并将 Dockerfile 放在其根目录中:

tar --create \
    /some/path/to/Dockerfile \
    /other/path/to/package-X.Y.Z.tgz \
    --transform 's,.*/,,' \
    --transform 's/package.*tgz/package.tgz/' |
docker build -t myapp/myapp:v1 -

笔记:

  • 第一个transform是展平目录结构,因此所有文件都会出现在文件的根目录中tar,这也是 Docker 期望它们出现的位置。

  • 第二个transform从包文件中删除版本号,这样您不必ADD package.tgz .在 Dockerfile 中编辑该行。

相关内容