Dockerfile FROM 能做判断吗?

2022-07-18 12:05:57 +08:00
 stille

一直是使用 buildx 来构建多架构镜像 push 到 docker hub,主要是 X86/ARM64 的. (github action 上来实施构建和 push)

大部分 FROM 基础镜像都是大厂的,所以架构支持没问题,但是最近有个项目的基础镜像没有 ARM64 版,也不太容易修改.

后来自己想办法做了个 ARM64 的..

所以现在项目的 Dockerfile 文件里 FROM 需要分别对应 2 个镜像分别构建 2 个版本的镜像.

请问如何能让 FROM 像 RUN 里可以用 if 判断来修改对应的架构镜像,来达到 buildx 单镜像多架构的目的?

是否可以用多段构建的方式,在第一阶段用支持多架构的 alpine as builder 在来判断架构,在来修改下一阶段 FROM 的镜像名?

1799 次点击
所在节点    Docker
6 条回复
ch2
2022-07-18 12:09:28 +08:00
貌似可以传 args 来解决
stille
2022-07-18 13:08:35 +08:00
@ch2 那只能是手动 docker build 时传递,我的想法是在 Dockerfile 中直接 if 后修改 ARG,后来发现 ARG 貌似只能固定赋值一个值,不能赋值变量.

FROM alpine
RUN if [ "$(uname -m)" = "x86_64" ]; then export DOCKER_NAME="aaa" ; else if [ "$(uname -m)" = "aarch64" ]; then export DOCKER_NAME="bbb" ; fi fi

ARG DOCKER=${DOCKER_NAME}

FROM ${DOCKER}/php-nginx:xxxx

以上这种方式不行,ARG 拿不到变量
initd
2022-07-18 13:35:49 +08:00
# syntax=docker/dockerfile:1
FROM --platform=$BUILDPLATFORM alpine as build

ARG TARGETPLATFORM
ARG BUILDPLATFORM


https://github.com/initdc/ssh-proxy-by-caddy-l4/blob/build/sh/Dockerfile#L2
stille
2022-07-18 14:59:32 +08:00
@initd 感觉我这个需求和你这个还是不同吧.
initd
2022-07-18 15:33:25 +08:00
momocraft
2022-08-07 22:24:28 +08:00
也许有方法把不同 image 捏成一个 multiarch image

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866966

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX