如果您想在 Cloud Foundry 上运行 docker 映像,只需运行 cf push -o <your/image>。只要您的运营团队启用了该功能 (not a lot of reason to disable it) 和 you meet the requirements,Cloud Foundry 就可以本地运行 docker 映像。
您可以通过运行cf feature-flag 并查找diego_docker enabled 行来检查是否启用了Docker 支持。如果显示为disabled,请与您的运营团队讨论启用它。
通过这样做,您无需进行任何复杂的转换。映像只是直接在 Cloud Foundry 上运行。
这并不能 100% 回答您的问题,但如果可能的话,我会推荐它。
要尝试回答您的问题,我认为没有一种简单的方法可以进行这种转换。 docker save 的输出是一堆层。这与 droplet 不同,后者是包含一些特定文件夹的存档(应用程序位 + 由您的 buildpack 安装的内容)。我想你可以转换它们,但没有明确的方法来做到这一点。
Cloud Foundry 使用 droplet 的方式与 Docker 映像不同,并且受到更多限制。液滴被提取到 Ubuntu Bionic(cflinuxfs3 根文件系统)之上的/home/vcap 中,然后应用程序从那里运行。您的 Droplet 只能包含将进入文件系统中这一位置的文件。
对于 Docker 映像,您实际上可以拥有一个完全自定义的文件系统。
因此,鉴于这种差异,我认为没有一种通用方法可以获取随机 docker 图像并将其转换为液滴。您可能做的最好的事情是使用一些受限制的 docker 图像集,例如从 Ubuntu Bionic 构建的那些,使用某些模式,提取运行您的应用程序所需的文件,将它们填充到将解压到 /home/vcap 之上的目录(即类似于一个水滴),tar gzip 并尝试使用它。
从docker save 的输出开始可能是个好主意。然后,您只需要从层的 tar 存档中提取所需的文件(即挖掘每一层,这是另一个 tar 存档并提取文件),然后将它们移动到类似于以下的目录结构中:
./
./deps/
./profile.d/
./staging_info.yml
./tmp/
./logs/
./app/
./deps 通常是 buildpack 安装所需依赖项的位置,./.profile.d/ 是您可以放置将在应用程序启动之前运行的脚本的位置,./app 是您的应用程序(大部分文件)将结束的位置。
staging_info.yml,我不是 100% 肯定是必需的,但基本上可以分解为 {"detected_buildpack":"java","start_command":""}。您可以伪造 detected_buildpack 将其设置为任何值,然后 start_command 显然是要运行的命令(不过您可以稍后覆盖它)。
我没有尝试这样做,因为cf push -o 更容易,但如果cf push -o 不是一个选项,你可以试一试。