在docker build期间在主机上执行命令

Pio*_*ski 34 docker dockerfile

是否可以创建Dockerfile在构建映像时在主机上执行命令?

现在我在做:

./script_that_creates_magic_file.sh
docker build .
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile:

FROM alpine
COPY magic_file
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

docker build .
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile:

FROM alpine
# invoke script_that_creates_magic_file.sh on the host
COPY magic_file
Run Code Online (Sandbox Code Playgroud)

当然,此脚本与Dockerfile位于同一目录中.

urb*_*ban 31

(只是一个建议)

我们通常有以下结构来构建我们的docker镜像:

my-image/
??? assets
?   ??? entrypoint.sh
?   ??? install.sh
??? build.sh
??? Dockerfile
??? README.md
??? VERSION
Run Code Online (Sandbox Code Playgroud)
  • build.sh:这是你应该调用的script_that_creates_magic_file.sh.其他常见任务涉及下载所需文件或临时从主机复制ssh密钥.最后,这个脚本会调用docker build .
  • Dockerfile:像往常一样,但根据我们需要运行的命令数量,我们可能会有一个install.sh
  • install.sh:这是复制并在容器内运行,安装包,删除不必要的文件等.不是100%肯定 - 我认为这种方法减少了单个数量,避免了单个命令RUN
  • entrypoint.sh:Container的入口点.允许我们在容器启动时执行任务(如解析环境变量)并打印调试信息

我发现上述结构方便且自我记录,因为团队中的每个人都可以构建任何图像(没有特殊说明/步骤).README是为了解释图像正在做什么...但我不会骗你...它通常是空的......(或者有一个h1gitlab显示):)

  • @AlexMcMillan 上述结构位于您的源代码库中。容器映像将只包含从 Dockerfile(主机->容器)复制/添加的内容以及稍后由 `install.sh`(容器->容器)安装的内容。build.sh 保留在主机上并且不会修改映像(准备 env 并调用构建)。由于 OP 没有要求运行,我没有提及任何内容,但我通常为此提供一个 `docker-compose.yml`。镜像中唯一不需要的文件是`install.sh`,它可以在完成后自行删除。现在有意义吗? (2认同)

tha*_*tah 7

回答这个问题; 没有内置功能可以在主机上运行命令docker build(即,没有"挂钩"来触发主机上的脚本).

如果您提供有关您的用例的更多信息,可能还有其他选择(例如使用组合--build-arg和docker撰写)

  • @TamusJRoyce 从文档中不难找到,但它非常基础。如果您在 `Dockerfile` 中定义了 `ARG foo`,您可以在文件中进一步引用 `$foo`,并使用 `docker build --build-arg foo="bar"` 为其传递一个值,但它是只是一个简单的字符串。 (2认同)