实际上,我不确定这是否可以做到,但我知道总会有黑客攻击,所以我很想知道各位专家对此有何看法。
我想在构建我的 docker 镜像时传递一个包作为参数,以便我可以使用相同的 dockerfile 部署不同的应用程序版本。
这是我想要实现的一个例子:
在构建图像时将包作为参数传递的能力(我知道语法是错误的,这只是一个例子)
docker build -t myapp/myapp:v1 . package_myapp_v1.tar
然后使用ADD
将Dockerfile
其提取到容器中。
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 中编辑该行。