构建多架构的Docker镜像,但Dockerfile根据架构需要不同的包

时间:2021-05-19 02:40:34

标签: docker

我正在试验 docker 的 buildx 并注意到除了一件事之外,一切似乎都很简单。我的 Dockerfile 需要根据架构拉取某些包。

例如,这是 Dockerfile 的一部分:

FROM XYZ

# Set environment variable for non-interactive install
ARG DEBIAN_FRONTEND=noninteractive

# Run basic commands to update the image and install basic stuff.
RUN apt update && \
    apt dist-upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" && \
    apt autoremove -y && \
    apt clean -y && \
    ...
    # Install amazon-ssm-agent
    mkdir /tmp/ssm && \
    curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb && \ 

从上面可以看出,该命令设置为使用硬编码链接拉下 Amazon SSM 代理。

解决这个问题的最佳方法是什么?我应该修改这个 Dockerfile 来创建一堆 if 条件吗?

1 个答案:

答案 0 :(得分:1)

当您使用 BuildKit 后端(现在是默认设置)时,Docker 会自动为您定义 a set of ARGs。您需要声明 404 Not Found,然后(在 ARG 命令中)您可以使用环境变量 RUN 来引用目标操作系统(文档建议 $TARGETOSlinux)。

windows

如果您需要构建 x86 或 ARM 映像,则有类似的 FROM ... # Must be explicitly declared, and after FROM ARG TARGETOS # Then it can be used like a normal environment variable RUN curl https://s3.amazonaws.com/ec2-downloads-$TARGETOS/... ,但其语法不一定与此 URL 中的内容匹配。如果 $TARGETPLATFORM$TARGETPLATFORMamd64,您可能需要重构 Debian architecture string。您可以在单个 arm 命令中设置一个 shell 变量,它会持续到该命令结束,但不再存在。

RUN