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

如何打包一个镜像三个环境都可以使用?

  •  
  •   tyit · 2021-07-17 18:26:35 +08:00 via iPhone · 3379 次点击
    这是一个创建于 1227 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个 Java 项目,代码里面有个配置文件写死了 nacos 配置中心的地址以及一些其它参数,如何构建镜像才能实现三个不同的环境使用?或者有没有更灵活的办法呢?

    比如三个环境的 nacos 地址

    Uat 环境 nacos 地址 uat.nacos.com

    Stag 环境 nacos 地址 stag.nacos.com

    Prod 环境 nacos 地址 prod.nacos.com

    19 条回复    2021-07-21 17:17:27 +08:00
    CEBBCAT
        1
    CEBBCAT  
       2021-07-17 20:04:41 +08:00
    - 在初始化时根据环境切换配置内容
    - 按照文件加载配置
    defunct9
        2
    defunct9  
       2021-07-17 20:10:11 +08:00 via iPhone
    有,启动 pod 的时候侵入修改
    creanme
        3
    creanme  
       2021-07-17 20:11:21 +08:00
    蹭主题,顺便问问前端如何打包一次,能在两个环境中使用。代码中有调用其它系统接口,测试环境和生产环境接口不同。之前要么在本地或者 pipeline 中打包两次,分别对应测试环境和生产环境,或者在代码里面根据当前域名来判断是否是生产环境,不过都不太好的样子。
    Acoffice
        4
    Acoffice  
       2021-07-17 20:17:24 +08:00 via Android
    通过不同变量来加载不同地址。
    ruiyi1994
        5
    ruiyi1994  
       2021-07-17 20:22:49 +08:00
    通过环境变量的改变来加载配置, 比如设置一个 RUN_ENV=production | stage | testing | dev
    ik
        6
    ik  
       2021-07-17 20:32:08 +08:00 via iPhone
    写成同样的地址呢, 不同环境配置不同解析?
    xuanbg
        7
    xuanbg  
       2021-07-17 21:12:04 +08:00   ❤️ 1
    JAVA_OPTIONS="-Dspring.profiles.active=prod"
    JAVA_OPTIONS="-Dspring.profiles.active=stag"
    clickhouse
        8
    clickhouse  
       2021-07-17 21:34:55 +08:00
    常见的就是楼上,指定 spring 的 profiles,配置都放在 jar 包里面。要不然就是启动 jar 的时候,动态传入需要的地址。
    Jooooooooo
        9
    Jooooooooo  
       2021-07-17 21:51:23 +08:00
    启动的时候有个 pre 脚本

    判定当前环境, 然后对应的替换配置文件中的内容
    zhzy0077
        10
    zhzy0077  
       2021-07-17 22:18:15 +08:00
    所有环境相关的配置,比如数据库连接,配置中心啥的,都应该是容器 /代码无关的,一般是通过环境变量拿进去。
    12 factor app 可以看看: III. Config
    Store config in the environment
    BBCCBB
        11
    BBCCBB  
       2021-07-17 22:25:01 +08:00
    通过启动变量.. 或者代码里写好, 根据启动参数里不同的 env 来使用不同的地址..
    thet
        12
    thet  
       2021-07-17 23:10:11 +08:00
    代码里面通过环境变量取值,镜像构建就不用管这些了,启动镜像的时候注入环境变量
    winglight2016
        13
    winglight2016  
       2021-07-18 12:16:32 +08:00
    镜像是在说 docker image 吗?不是支持 env 配置吗?这个跟 image 无关,在 run 的时候加-env 就行了
    lff0305
        14
    lff0305  
       2021-07-18 13:12:20 +08:00 via Android
    docker/kubernetes 都可以在部署的时候指定一个 file 覆盖镜像中的的 file,docker 通过-v , kubernetes 通过 configmap/volume
    tyit
        15
    tyit  
    OP
       2021-07-18 16:14:43 +08:00 via iPhone
    @xuanbg 这个可以,也就是 resource 下面,放三个文件,比如 uat stag prod,构建镜像,然后 deployment 启动的时候,加一个 Java_opts 这样传过去 docker 启动命令。应该可以实现了。
    tyit
        16
    tyit  
    OP
       2021-07-18 16:15:33 +08:00 via iPhone
    @lff0305 这个动作是构建的时候动作,构建完了就是一个完整的 jar 包,怎么用 file 覆盖?
    tyit
        17
    tyit  
    OP
       2021-07-18 16:16:22 +08:00 via iPhone
    @thet 嗯嗯,思路是这样。
    zzl22100048
        18
    zzl22100048  
       2021-07-19 10:02:00 +08:00
    不知道用的是不是 SpringBoot,SpringBoot application 配置支持环境变量
    Java 打包镜像用 jib 比较适合,
    tms
        19
    tms  
       2021-07-21 17:17:27 +08:00
    靠运行时的环境变量来区分
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3501 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:46 · PVG 08:46 · LAX 16:46 · JFK 19:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.