具有长初始命令的容器的 Docker 模式

具有长初始命令的容器的 Docker 模式

我希望将大量本地和开源代码打包到 Docker 容器中,然后分发到主机上进行构建和运行。最终容器的目的是以命令行方式执行并输出结果,例如 ( docker run cmdcontainer args)。我遇到的问题是,分发的源代码需要在特定主机上进行定位和编译,该主机将运行一次,这需要数小时才能完成。但是,一旦编译完成,命令就会运行得非常快。

所以我想知道是否存在一种已知的docker模式适用于这种工作流程:

分发带有源文件的 Docker 容器 -> 运行容器以生成带有已编译二进制文件的新容器 -> 后续运行执行已编译的容器

因为这基本上是在旧容器之上分层放置一个新容器,所以这似乎是可能的,但我是一个 docker 新手。

答案1

由于每个主机都是独一无二的,我能想到的最佳解决方案是使用卷进行持久化。您需要在入口点执行以下工作流程:

  1. 检查卷中已编译代码的版本
  2. 如果版本不匹配,则删除卷内容
  3. 如果版本未设置或不匹配,请运行编译
  4. 将新版本号写入该卷
  5. 从卷中的已编译版本运行您的应用程序

这确实要求您的镜像构建嵌入版本号,例如 git hash。您可以使用构建参数执行此操作:

docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...

然后你的 Dockerfile 将包含类似以下内容:

ARG GIT_REV
ENV GIT_REV=${GIT_REV}

请注意,任何没有卷运行的用户仍会看到每次运行都执行编译。

相关内容