我正在试验 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 条件吗?
答案 0 :(得分:1)
当您使用 BuildKit 后端(现在是默认设置)时,Docker 会自动为您定义 a set of ARGs。您需要声明 404 Not Found
,然后(在 ARG
命令中)您可以使用环境变量 RUN
来引用目标操作系统(文档建议 $TARGETOS
或linux
)。
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
是 $TARGETPLATFORM
或 amd64
,您可能需要重构 Debian architecture string。您可以在单个 arm
命令中设置一个 shell 变量,它会持续到该命令结束,但不再存在。
RUN