V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
imherer

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

  •  
  •   imherer · May 21, 2019 · 7804 views
    This topic created in 2537 days ago, the information mentioned may be changed or developed.
    比如我现在在本地开发完成了,需要打包部署到服务器上。 因为开发的时候好多配置项都是本地的,比如数据库连接啥的,部署到服务器上需要修改为正式的。

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

    拿走不谢

    这不是个 golang 的问题
    messyidea
        11
    messyidea  
       May 21, 2019
    判断生产环境还是测试环境,然后用不同的数据库
    xfriday
        12
    xfriday  
       May 21, 2019
    k8s+configMap
    lonelygo
        13
    lonelygo  
       May 21, 2019
    @imherer 写着玩,配置 hardcode 在代码里,也不科学鸭,换个机子改起来多累。
    yanzixuan
        14
    yanzixuan  
       May 21, 2019
    @godgrp 哪个配置管理中心最好?有推荐的么?
    imherer
        15
    imherer  
    OP
       May 21, 2019
    @lonelygo 所以来向各位大佬取经了😀
    zichen
        16
    zichen  
       May 21, 2019
    单独建一个配置文件的代码库,持续集成流水线部署的时候,会直接拉取对应环境的配置文件部署。
    loveCoding
        17
    loveCoding  
       May 21, 2019
    @wuchujie 相比读 path,配置文件可能会好点,毕竟跟着代码走,不用维护 path 什么的减少运维成本
    wuchujie
        18
    wuchujie  
       May 21, 2019
    @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  
       May 21, 2019
    k8s+docker
    Kilerd
        20
    Kilerd  
       May 21, 2019
    dotenv
    Muninn
        21
    Muninn  
       May 21, 2019
    @wuchujie 那你基本白用 docker 了,一般不是那么用的。

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

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

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

    配置是在配置中心或者在启动集群的配置文件里的。用环境变量传入容器。
    wuchujie
        22
    wuchujie  
       May 21, 2019
    @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  
       May 21, 2019
    参考 b 站
    zclHIT
        24
    zclHIT  
       May 21, 2019
    配置文件中设置不同的环境配置,然后配置一个 RunMode,不同环境使用不同的 RunMode
    boris1993
        25
    boris1993  
       May 21, 2019 via Android
    公司不写 Go
    自己的玩具是读 yaml 的,同时带有命令行开关
    除了配置文件,也可以考虑读环境变量
    但是绝对不要写死在代码里
    gxm44
        26
    gxm44  
       May 21, 2019
    dotenv + 1
    Muninn
        27
    Muninn  
       May 21, 2019
    @wuchujie compose file 不放代码库里的,你可以放一个隐藏掉关键信息的 example。 部署的时候只需要这一个文件就行了,你也不需要把 repo clone 下来呀。

    现在还有一个选择是用 docker secret。 这样部署的服务器上也看不到敏感信息了。 不过需要在代码里兼容读取。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2596 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 12:46 · PVG 20:46 · LAX 05:46 · JFK 08:46
    ♥ Do have faith in what you're doing.