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

时间:2017-03-11 12:55:28

标签: docker dockerfile

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

现在我正在做:

./script_that_creates_magic_file.sh
docker build .

使用Dockerfile:

FROM alpine
COPY magic_file

我希望能够:

docker build .

使用Dockerfile:

FROM alpine
# invoke script_that_creates_magic_file.sh on the host
COPY magic_file

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

2 个答案:

答案 0 :(得分:23)

(只是一个建议)

我们通常有以下结构来构建我们的泊坞窗图像:

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

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

答案 1 :(得分:7)

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

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