V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stille
V2EX  ›  Docker

Dockerfile FROM 能做判断吗?

  •  
  •   stille ·
    stilleshan · 199 天前 · 1022 次点击
    这是一个创建于 199 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    6 条回复    2022-08-07 22:24:28 +08:00
    ch2
        1
    ch2  
       199 天前
    貌似可以传 args 来解决
    stille
        2
    stille  
    OP
       199 天前
    @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
        3
    initd  
       199 天前
    # 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
        4
    stille  
    OP
       199 天前
    @initd 感觉我这个需求和你这个还是不同吧.
    initd
        5
    initd  
       199 天前
    momocraft
        6
    momocraft  
       179 天前
    也许有方法把不同 image 捏成一个 multiarch image
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   314 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.