我有一个场景,我可以访问客户的AWS环境(除了代码库),并且客户将其映像呈现在AWS ECR上。我有一个由Graviton (ARM)服务器组成的EKS kubernetes节点池。我需要从现有的映像重新构建到arm64架构,而不需要对代码库进行任何形式的访问。
我想问是否有可能实现这一点,应该遵循哪些步骤?(高级步骤可以)。
我知道复制图像的步骤(这很有帮助),但不确定架构的步骤。
正如@BMitch如实指出的那样,基本答案是一个冷酷的否定。
既然这是不可能的,我们怎么可能尝试这样的事情呢?
最简单的方法(而且更省时)
正在使用模拟器,正如这里所建议的(他还提到了Linux的一些例子,因为您是原始容器之一),模拟器可以自己运行容器(如VM或Docker Desktop及其功能),但我对此持保留意见,即使是像苹果这样有影响力的大公司也使用模拟器作为未准备好的软件的桥梁。
如果你想要更多,有更多的时间:
让我们从简单的开始——Java、python、bash和其他解释性语言
如果使用其中一个,则为"easy"复制项目文件(手动从代码中找出依赖关系,尽管版本是一个doozy)准备新的容器与语言运行时程序和库,复制所有的东西到新的环境,并设置所有需要的,这是如果前一步计算出依赖关系是有希望成功的。
如果使用java只需复制.jar文件,使用相同的JRE (Java运行时环境),您应该可以很好地开始,查看这篇文章的异常
如果使用python或Javascript,只要你能得到他们正在使用的库(特定版本),你就可以,在类似的情况下Java
bash可能不在乎,只要你有你需要的所有脚本
现在,如果你是一个喜欢冒险的人,你认为你可以打败财富500强公司,这是一个很好的利用你的时间来骑行。
如果谈论像C, c++, Golang和其他编译语言
然后你将有乐趣将x86或amd64汇编代码(或更好的机器代码)翻译成ARM汇编代码,这里有一个人试图拉类似的事情的例子。开玩笑地说,这就是模拟器实时做的事情,所以要么使用一个知名的模拟器(这可能会降低你的性能和CPU时间预算),要么故意手工翻译每个程序(一路上为ARM优化)
如果有可能得到他们的帮助
docker在使用buildkit
(使用docker buildx
docker命令)为多个平台(体系结构)构建docker映像时具有以下3个路径的特性:
- 我们首先提到,使用像QEMU 这样的模拟器
- 第二个(可能不太相关)是有多个具有不同架构的节点来缓解
- 第三是创建一个多平台的Dockerfile,这使得为每个平台创建一个具有不同阶段的单一Dockerfile和为架构之间相似的部分创建通用阶段
这里还有一篇关于这个问题的docker文章供进一步研究