在构建/运行时将参数列表传递给docker

时间:2017-01-05 16:07:06

标签: git docker dockerfile

我正在编写一个dockerfile,我想下载一个更改的git repos:repo1,repo2,repo3。 我应该如何在图像构建或容器运行时将这些url /字符串提供给dockerfile?

我知道可以使用ARG指令并使用

传递参数

docker build --build-arg <var-name>=<value>

但是当我有一个任意长度的args列表时会发生什么?

非常感谢。

2 个答案:

答案 0 :(得分:0)

构建时间

我能想到的最好的方法是传入一个以逗号分隔的列表:

 docker build --build-arg repos=repo1,repo2

Docker无法将此解析为一个列表,但在构建期间运行的脚本可能会将字符串拆分为一个列表。

运行时间

如果使用ENTRYPOINT定义命令,则docker run的所有尾随参数都会附加到入口点命令。

所以如果您的Dockerfile包含:

   ENTRYPOINT echo hello

然后:

   docker run myimage glorious world 

...将运行命令

   echo hello glorious world

答案 1 :(得分:0)

  

图像构建时的dockerfile

这可能不是最好的主意,但你最终会得到env变量并使用dockerfile中的变量。

  

容器运行时间

这是,恕我直言,一个更好的主意。如果您知道命令需要输入,可以在dockerfile中添加:

<?php

header('Content-Type: application/json');


  $folder = $_POST['folder'];
  echo json_encode($folder);

?>

我们为git提供了一个“硬编码”参数,也就是说,每次运行此docker容器时,参数ENTRYPOINT ["git","-c","/tmp"] CMD ["--help"] 都会传递给git。我以此为例,以备您需要时使用,但不是必需的,-c /tmp可以正常使用。

在这种情况下,CMD是“默认”。在这种情况下,我们使用“--help”作为帮助用户添加参数的一种方式。

您可以将CMD设为默认仓库,或任何您想要的。

恕我直言,ENTRYPOINT和CMD应始终结合使用。

如果您对使用ENTRYPOINT [](这是根据Docker的首选形式)感到好奇,这来自docker docs:

  

注意:与shell表单不同,exec表单不会调用命令   贝壳。这意味着不会发生正常的shell处理。对于   例如,CMD [“echo”,“$ HOME”]不会进行变量替换   $ HOME。如果你想要shell处理,那么要么使用shell形式,要么使用   直接执行shell,例如:CMD [“sh”,“ - c”,“echo $ HOME”   ]。当使用exec表单并直接执行shell时,如   对于shell表单的情况,它是执行环境的shell   变量扩展,而不是码头。

Source