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

2021-05-23 18:16:31 +08:00
 wunonglin

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

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 上级目录的东西。

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

3110 次点击
所在节点    程序员
13 条回复
xuanbg
2021-05-23 18:41:59 +08:00
COPY ../library/*
wunonglin
2021-05-23 18:48:47 +08:00
@xuanbg #1 复制不了 Dockerfile 外层的文件,用*会打平目录结构
ttyn
2021-05-23 18:52:14 +08:00
将 docker 编译上下文设置为根目录,指定 Dockerfile 路径就可以了

# 在 project 根目录运行编译命令
docker build -t myname:mytag -f ./app1/Dockerfile .
MengQuadra
2021-05-23 22:41:14 +08:00
我选择 Dockerfile 全部放上级目录
Dockerfile.app1
Dockerfile.app2
疑似能少打几个字符....
wunonglin
2021-05-23 22:46:42 +08:00
@MengQuadra #4 其实 app 的数量和层级不定的。假设有 100 个 app,全放在根目录,想想都感人
MengQuadra
2021-05-24 00:18:04 +08:00
@wunonglin 太多还是分开吧...少的我感觉更直观, 多起来真是脑壳疼
hallDrawnel
2021-05-24 01:14:55 +08:00
每个会被独立编译的服务我们都有自己的 go.mod 来解决依赖问题。这样做好处很多,具体见 https://medium.com/@ckeyes88/go-modules-in-real-life-87a21fb4d8aa
waising
2021-05-24 09:47:55 +08:00
我是把所有的自定义依赖包 功能包都弄成私有 git 仓库 mod 方式引进不同的项目里
cvl
2021-05-24 11:57:20 +08:00
-v
actar
2021-05-24 16:08:30 +08:00
go mod vendor 生成 vendor 目录,打包时带上 -mod=vendor 选项
actar
2021-05-24 16:12:25 +08:00
我看了一下,需要每个目录里面都有 go.mod 。和我想的不太一样
joesonw
2021-05-24 18:50:20 +08:00
monorepo 最优雅的解决方案就是上 bazel 了.
wunonglin
2021-05-24 19:17:16 +08:00
@joesonw #12 是的。我是按 B 站开源项目学习的,bazel 的确还行,只是还不好学

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778701

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX