【问题标题】:Docker pull from different source for different architectureDocker 从不同的来源拉取不同的架构
【发布时间】:2020-12-06 23:49:39
【问题描述】:

我有一个提取 FROM hivemq/hivemq-ce 的 Dockerfile。这适用于“标准”平台,但不适用于 Raspberry Pi。因此,我按照official HiveMQ repo 中的教程直接在RasPi 上为arm64 构建了映像,并将其推送到frederikheld/hivemq-ce。如果我将 FROM 行更改为 FROM frederikheld/hivemq-ce,Dockerfile 在 RasPi 上运行良好。

所以现在我的图像可以在不同来源的不同平台上运行。但是我怎样才能让我的 Dockerfile 在所有平台上工作呢?有什么方法可以从不同的资源中提取不同的架构?

【问题讨论】:

    标签: docker arm64 hivemq


    【解决方案1】:

    As outlined here docker 支持多种 cpu 架构,并且会为正确的平台选择正确的镜像。因此,您可以为frederikheld/hivemq-ce 构建一个非 arm64 映像并将其推送到同一位置,而不会影响 arm64 映像。

    您应该能够运行 docker manifest inspect frederikheld/hivemq-ce 以查看给定图像的可用架构。

    【讨论】:

    • 但是所有其他平台的镜像已经在 hivemq/hivemq-ce 上可用。所以我需要将相同的图像推送到我自己的位置,只是为了将所有架构都放在一个地方?好像违反了 DRY 原则……有没有其他办法,比如“if arch==arm64: FROM location1, else: FROM location2”
    • hivemq/hivemq-ce 似乎没有构建手臂图像。如果您具有推送访问权限,则可以将您的手臂图像推送到该存储库。有一个这样的 if 语句可能是有意义的(你可以使用 build arg 自己实现它),但我认为 docker 期望存储库为多个架构构建,这样你就不会遇到这个问题。您可能需要请求为 arm64 构建 hivemq
    【解决方案2】:

    我采用了这种方法:

    start.sh:

    ...
    if [ "$(uname -m)" = "aarch64" ]; then
        docker-compose -f docker-compose.aarch64.yml up -d --build --force-recreate
    else
        docker-compose up -d --build --force-recreate
    fi
    ...
    

    这需要一个标准的docker-compose.yml 和一个额外的docker-compose.<architecture>.yml,以满足每个具有不同需求的架构。

    这不是很好,但它适用于我的环境。

    不过,我仍然愿意寻求更好的解决方案!

    【讨论】:

      最近更新 更多