V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
imherer
V2EX  ›  Go 编程语言

大佬们你们的 go 项目打包到部署的流程是怎么样的

  •  
  •   imherer · 2019-05-21 10:23:58 +08:00 · 7182 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我现在在本地开发完成了,需要打包部署到服务器上。 因为开发的时候好多配置项都是本地的,比如数据库连接啥的,部署到服务器上需要修改为正式的。

    总不能在代码里把配置项修改了,然后在打包部署。完了开发的时候再改成测试的吧?
    27 条回复    2019-05-21 20:32:51 +08:00
    loveCoding
        1
    loveCoding  
       2019-05-21 10:26:59 +08:00   ❤️ 1
    ./server run --config prod.ini ./server run --config dev.ini ./server run --config local.ini
    godgrp
        2
    godgrp  
       2019-05-21 10:27:52 +08:00   ❤️ 2
    1、配置文件
    2、配置管理中心,etcd 等方案很多
    kwanzaa
        3
    kwanzaa  
       2019-05-21 10:29:22 +08:00   ❤️ 1
    我写的玩具都是读取 Json 文件来获取配置。。。
    Immortal
        4
    Immortal  
       2019-05-21 10:38:19 +08:00
    你们配置不读文件的???
    imherer
        5
    imherer  
    OP
       2019-05-21 10:40:39 +08:00
    @Immortal 公司项目没用到 go,我自己写着玩的😂
    guyeu
        6
    guyeu  
       2019-05-21 10:49:59 +08:00
    emmmm 第一次见到配置 hardcode 在代码里的。。。
    tjyao520
        7
    tjyao520  
       2019-05-21 10:50:17 +08:00   ❤️ 1
    os.getenv()
    HuasLeung
        8
    HuasLeung  
       2019-05-21 10:53:18 +08:00   ❤️ 1
    服务器端灵活使用 git+docker,每次代码更新 git pull 后 docker 直接制作镜像 run 起来
    wuchujie
        9
    wuchujie  
       2019-05-21 11:11:26 +08:00
    @loveCoding 看了下 b 站的一个开源 web 库就是用这种方法读写配置文件。。但是不知道是 os.getenv() 读取同目录下的 config.json 好呢。还是用这种方法比较好。
    Muninn
        10
    Muninn  
       2019-05-21 11:11:33 +08:00   ❤️ 3
    https://12factor.net/zh_cn/

    拿走不谢

    这不是个 golang 的问题
    messyidea
        11
    messyidea  
       2019-05-21 11:16:31 +08:00
    判断生产环境还是测试环境,然后用不同的数据库
    xfriday
        12
    xfriday  
       2019-05-21 11:22:19 +08:00
    k8s+configMap
    lonelygo
        13
    lonelygo  
       2019-05-21 11:28:25 +08:00
    @imherer 写着玩,配置 hardcode 在代码里,也不科学鸭,换个机子改起来多累。
    yanzixuan
        14
    yanzixuan  
       2019-05-21 11:29:56 +08:00
    @godgrp 哪个配置管理中心最好?有推荐的么?
    imherer
        15
    imherer  
    OP
       2019-05-21 11:33:06 +08:00
    @lonelygo 所以来向各位大佬取经了😀
    zichen
        16
    zichen  
       2019-05-21 11:33:42 +08:00
    单独建一个配置文件的代码库,持续集成流水线部署的时候,会直接拉取对应环境的配置文件部署。
    loveCoding
        17
    loveCoding  
       2019-05-21 11:36:14 +08:00
    @wuchujie 相比读 path,配置文件可能会好点,毕竟跟着代码走,不用维护 path 什么的减少运维成本
    wuchujie
        18
    wuchujie  
       2019-05-21 11:46:00 +08:00
    @lonelygo
    @xfriday
    @Muninn
    @zichen
    @loveCoding
    能请教一下 docker 是怎么部署吗?
    我现在一直以来的思路是抛开语言层面。比如 nodejs python 这些需要虚拟环境的语言。
    我是用 docker 做一个包涵所有虚拟环境库的镜像。然后比如我的代码目录是 /home/deploy/app 我就映射 /home/deploy/app 进去镜像的根目录 /app 然后运行 python app.py 或者 node app.js
    以后每次更新代码。我只需要在代码目录 git pull 然后 restart 一下容器就可以。。不用每次更新代码都打包一个镜像。
    a134698815
        19
    a134698815  
       2019-05-21 12:30:15 +08:00
    k8s+docker
    Kilerd
        20
    Kilerd  
       2019-05-21 13:02:44 +08:00
    dotenv
    Muninn
        21
    Muninn  
       2019-05-21 15:15:07 +08:00
    @wuchujie 那你基本白用 docker 了,一般不是那么用的。

    基本都是每个版本靠持续集成自动测试和构建镜像。

    生产部署可以自动,也可以手动。

    大项目有很多容器用 k8s,小一点用 swarm 再小一点单机用 docker-compose。

    配置是在配置中心或者在启动集群的配置文件里的。用环境变量传入容器。
    wuchujie
        22
    wuchujie  
       2019-05-21 16:13:49 +08:00
    @Muninn 请教一下。如果按照小一点单机 docker-compose 来处理的话。。正常的配置文件应该怎么写比较好。
    比如 redis -> ip:port mysql-> ip:port user:password 这些好像不能打包进镜像里面 config.yaml 或者 config.json 吧?

    我有个思路是代码层读取环境变量 比如 go python 初始化项目的时候 读取一下+格式化一下 env['redis'] 和 env['mysql']
    然后在 docker-compose 写好 environment 这样可以吗?但是会不会导致上传代码的时候 docker-compose 也给上传了。让人家看的一目了解
    wuhongwei
        23
    wuhongwei  
       2019-05-21 16:15:29 +08:00
    参考 b 站
    zclHIT
        24
    zclHIT  
       2019-05-21 16:42:46 +08:00
    配置文件中设置不同的环境配置,然后配置一个 RunMode,不同环境使用不同的 RunMode
    boris1993
        25
    boris1993  
       2019-05-21 16:55:06 +08:00 via Android
    公司不写 Go
    自己的玩具是读 yaml 的,同时带有命令行开关
    除了配置文件,也可以考虑读环境变量
    但是绝对不要写死在代码里
    gxm44
        26
    gxm44  
       2019-05-21 19:52:52 +08:00
    dotenv + 1
    Muninn
        27
    Muninn  
       2019-05-21 20:32:51 +08:00
    @wuchujie compose file 不放代码库里的,你可以放一个隐藏掉关键信息的 example。 部署的时候只需要这一个文件就行了,你也不需要把 repo clone 下来呀。

    现在还有一个选择是用 docker secret。 这样部署的服务器上也看不到敏感信息了。 不过需要在代码里兼容读取。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5521 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:01 · PVG 15:01 · LAX 23:01 · JFK 02:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.