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

这样的微服务目录结构该如何优雅地编译

  •  
  •   wunonglin · 2021-05-23 18:16:31 +08:00 · 2941 次点击
    这是一个创建于 1068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目目录,app1 和 2 均引用了 library 的包

    • project
      • go.mod
      • go.sum
      • docker-compose.yml
      • app1
        • Dockerfile
      • app2
        • Dockerfile
      • library
        • tool1
        • tool2

    Dockerfile 长这样

    FROM golang:latest as build
    
    COPY . /data/
    WORKDIR /data/
    
    RUN go build -o dist/main cmd/main.go
    
    FROM scratch
    
    WORKDIR /app
    
    EXPOSE 80
    
    CMD ["./main"]
    

    这样 docker-compose 编辑 Dockerfile 的话会报找不到 library 的引用,因为没有 copy 进来。但是好像 Dockerfile 的 copy 不能 copy 上级目录的东西。

    所以现在的问题是如何能够优雅地编译微服务?

    13 条回复    2021-05-24 19:17:16 +08:00
    xuanbg
        1
    xuanbg  
       2021-05-23 18:41:59 +08:00
    COPY ../library/*
    wunonglin
        2
    wunonglin  
    OP
       2021-05-23 18:48:47 +08:00
    @xuanbg #1 复制不了 Dockerfile 外层的文件,用*会打平目录结构
    ttyn
        3
    ttyn  
       2021-05-23 18:52:14 +08:00   ❤️ 2
    将 docker 编译上下文设置为根目录,指定 Dockerfile 路径就可以了

    # 在 project 根目录运行编译命令
    docker build -t myname:mytag -f ./app1/Dockerfile .
    MengQuadra
        4
    MengQuadra  
       2021-05-23 22:41:14 +08:00
    我选择 Dockerfile 全部放上级目录
    Dockerfile.app1
    Dockerfile.app2
    疑似能少打几个字符....
    wunonglin
        5
    wunonglin  
    OP
       2021-05-23 22:46:42 +08:00
    @MengQuadra #4 其实 app 的数量和层级不定的。假设有 100 个 app,全放在根目录,想想都感人
    MengQuadra
        6
    MengQuadra  
       2021-05-24 00:18:04 +08:00
    @wunonglin 太多还是分开吧...少的我感觉更直观, 多起来真是脑壳疼
    hallDrawnel
        7
    hallDrawnel  
       2021-05-24 01:14:55 +08:00
    每个会被独立编译的服务我们都有自己的 go.mod 来解决依赖问题。这样做好处很多,具体见 https://medium.com/@ckeyes88/go-modules-in-real-life-87a21fb4d8aa
    waising
        8
    waising  
       2021-05-24 09:47:55 +08:00
    我是把所有的自定义依赖包 功能包都弄成私有 git 仓库 mod 方式引进不同的项目里
    cvl
        9
    cvl  
       2021-05-24 11:57:20 +08:00
    -v
    actar
        10
    actar  
       2021-05-24 16:08:30 +08:00
    go mod vendor 生成 vendor 目录,打包时带上 -mod=vendor 选项
    actar
        11
    actar  
       2021-05-24 16:12:25 +08:00
    我看了一下,需要每个目录里面都有 go.mod 。和我想的不太一样
    joesonw
        12
    joesonw  
       2021-05-24 18:50:20 +08:00
    monorepo 最优雅的解决方案就是上 bazel 了.
    wunonglin
        13
    wunonglin  
    OP
       2021-05-24 19:17:16 +08:00
    @joesonw #12 是的。我是按 B 站开源项目学习的,bazel 的确还行,只是还不好学
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2821 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:32 · PVG 23:32 · LAX 08:32 · JFK 11:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.