Go 如何冻结具有依赖关系的微版本?
我想用micro和go依赖项的固定版本构建docker映像。我计划使用Go 如何冻结具有依赖关系的微版本?,go,go-micro,Go,Go Micro,我想用micro和go依赖项的固定版本构建docker映像。我计划使用dep: git checkout git@github.com:micro/micro.git dep ensure git add Gopkg.toml git add Gopkg.lock # Build micro CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro ./main.go # Build
dep
:
git checkout git@github.com:micro/micro.git
dep ensure
git add Gopkg.toml
git add Gopkg.lock
# Build micro
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o micro ./main.go
# Build docker image
...
因此,我的问题是,构建一致的micro docker映像是否是最佳解决方案?docker文件的一个示例可以是:
FROM golang:1.9-alpine3.6 as builder
# Install package manager
RUN apk add --no-cache --virtual .go-dependencies git curl \
&& curl https://glide.sh/get | sh
# Copy files from context
WORKDIR /go/src/github.com/foo/bar
COPY . .
# Install project dependencies, test and build
RUN glide install \
&& go test ./... \
&& CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags '-w' -i -o ./entry ./main.go ./plugins.go
# Build final image with binary
FROM alpine:3.6
RUN apk add --update ca-certificates && \
rm -rf /var/cache/apk/* /tmp/*
WORKDIR /
COPY --from=builder /go/src/github.com/foo/bar/entry .
ENTRYPOINT [ "/entry" ]
glide.yaml看起来是这样的:
package: .
import:
- package: github.com/micro/go-micro
version: ^0.3.0
subpackages:
- client
- server
- package: github.com/micro/go-plugins
version: ^0.6.1
subpackages:
- wrapper/trace/opentracing
- broker/nats
- transport/nats
- package: github.com/opentracing/opentracing-go
version: ^1
- package: github.com/openzipkin/zipkin-go-opentracing
version: ^0.3
testImport:
- package: github.com/golang/mock
subpackages:
- gomock
- package: github.com/smartystreets/goconvey
subpackages:
- convey
在我的例子中,它看起来很好,速度也很快,而且它是go中的官方依赖管理器,所以我认为它是一个正确的选择。您尝试了什么?你遇到了什么问题?我希望在每次构建micro时都能有一个一致的docker图像。好吧,但你尝试了什么?您遇到了什么问题?在我们锁定供应商的第一个方法中,我们也使用了dep,但主要的障碍是它的速度。花了很长时间来构建和下载所有内容。从那以后,我们转向了Glide,它在生产中的工作非常可靠。您只需花时间在glide.yaml中定义每个供应商以及要锁定的版本。@Flimzy我在问题中描述了我试图用micro构建docker映像的方式。我只是要确认或拒绝什么,这是一个正确的方式来建立docker形象与冻结微版本依赖与否。