【问题标题】:Execute command on host during docker build在 docker build 期间在主机上执行命令
【发布时间】:2017-03-11 12:55:27
【问题描述】:

是否可以创建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在同一个目录。

【问题讨论】:

  • stackoverflow.com/questions/32163955/… 的可能重复项。无论如何,还有一些其他可能的方法可以做到这一点,即 ssh、安装卷等。使用更多的搜索功能。祝你好运!

标签: docker dockerfile


【解决方案1】:

(只是一个建议)

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

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:容器的入口点。允许我们在容器启动时执行任务(如解析环境变量)并打印调试信息

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

【讨论】:

  • 这是否意味着您的容器映像必须包含构建您的应用所需的一切,而您想要它做的只是运行您的应用?
  • @AlexMcMillan 上述结构存在于您的源代码库中。容器镜像只会包含从 Dockerfile(主机->容器)复制/添加的任何内容,以及稍后由 install.sh(容器->容器)安装的任何内容。 build.sh 保留在主机上并且不修改图像(准备环境并调用构建)。由于 OP 没有要求运行,因此我没有提及任何内容,但我通常为此提供 docker-compose.yml。图像中唯一不需要的文件是install.sh,一旦完成,它可能会自行删除。现在有意义吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 2019-05-17
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2020-07-28
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多