skaffold 不会在 minikube 中重新加载 golang 代码
skaffold does not reload golang code in minikube
我一直在尝试使用本地 minikube 安装的 skaffold。能够在尽可能接近生产的项目上开发项目真是太好了。
如果我使用 skaffold github repo 上提供的 getting-started example,一切正常,我的 IDE (intellij idea) 在断点处停止,当我修改代码时,更改会立即反映出来。
现在我的个人项目比一个简单的 main.go 文件复杂一点,但事情没有按预期进行。 IDE 在断点处停止,但即使我在控制台中看到 skaffold 检测到对该特定文件所做的更改,但没有发生热代码重新加载,但不幸的是,这些更改不是 reflected/applied.
一个docker文件用于构建镜像,docker文件如下
FROM golang:1.14 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app.o ./cmd/shortener/shortener.go
FROM alpine:3.12
COPY --from=builder /app.o ./
COPY --from=builder /app ./
EXPOSE 3000
ENV GOTRACEBACK=all
CMD ["./app.o"]
在 kubernetes 方面,我正在创建部署和服务,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: url-shortener-deployment
spec:
selector:
matchLabels:
app: url-shortener
template:
metadata:
labels:
app: url-shortener
spec:
containers:
- name: url-shortener
image: url_shortener
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: url-shortener-service
spec:
selector:
app: url-shortener
ports:
- port: 3000
nodePort: 30000
type: NodePort
至于 skaffold,这里是 skaffold.yaml 文件:
apiVersion: skaffold/v2beta5
kind: Config
metadata:
name: url-shortener
build:
artifacts:
- image: url_shortener
context: shortener
docker:
dockerfile: build/docker/Dockerfile.dev
noCache: false
deploy:
kubectl:
manifests:
- stack/mongo/mongo.yaml
- shortener/deployments/kubernetes/shortener.yaml
我启用了详细日志记录,每当我保存 (CTRL+S) 源代码文件时,我都会在输出中注意到这一点。
time="2020-07-05T22:51:08+02:00" level=debug msg="Found dependencies for dockerfile: [{go.mod /app true} {go.sum /app true} {. /app true}]"
time="2020-07-05T22:51:08+02:00" level=info msg="files modified: [shortener/internal/handler/rest/rest.go]"
我假设这意味着已检测到更改。
断点在 IDE 中正常工作,但 kubernetes 中的代码交换似乎没有发生
debug 功能故意禁用 Skaffold 的 file-watching,它会在文件更改时重建和重新部署容器。重新部署会导致现有容器终止,从而终止所有正在进行的调试会话。由于您不小心保存了对评论的更改,导致您精心构建的调试会话被拆除,这真是令人迷惑和恼火!
但我们正在研究如何在 Cloud Code 中更好地支持这种更多的迭代调试。
如果您直接使用 Skaffold,我们最近添加了通过 skaffold debug --auto-build --auto-deploy
(存在于 v1.12 中)重新启用文件监视的功能。
我一直在尝试使用本地 minikube 安装的 skaffold。能够在尽可能接近生产的项目上开发项目真是太好了。
如果我使用 skaffold github repo 上提供的 getting-started example,一切正常,我的 IDE (intellij idea) 在断点处停止,当我修改代码时,更改会立即反映出来。
现在我的个人项目比一个简单的 main.go 文件复杂一点,但事情没有按预期进行。 IDE 在断点处停止,但即使我在控制台中看到 skaffold 检测到对该特定文件所做的更改,但没有发生热代码重新加载,但不幸的是,这些更改不是 reflected/applied.
一个docker文件用于构建镜像,docker文件如下
FROM golang:1.14 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app.o ./cmd/shortener/shortener.go
FROM alpine:3.12
COPY --from=builder /app.o ./
COPY --from=builder /app ./
EXPOSE 3000
ENV GOTRACEBACK=all
CMD ["./app.o"]
在 kubernetes 方面,我正在创建部署和服务,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: url-shortener-deployment
spec:
selector:
matchLabels:
app: url-shortener
template:
metadata:
labels:
app: url-shortener
spec:
containers:
- name: url-shortener
image: url_shortener
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: url-shortener-service
spec:
selector:
app: url-shortener
ports:
- port: 3000
nodePort: 30000
type: NodePort
至于 skaffold,这里是 skaffold.yaml 文件:
apiVersion: skaffold/v2beta5
kind: Config
metadata:
name: url-shortener
build:
artifacts:
- image: url_shortener
context: shortener
docker:
dockerfile: build/docker/Dockerfile.dev
noCache: false
deploy:
kubectl:
manifests:
- stack/mongo/mongo.yaml
- shortener/deployments/kubernetes/shortener.yaml
我启用了详细日志记录,每当我保存 (CTRL+S) 源代码文件时,我都会在输出中注意到这一点。
time="2020-07-05T22:51:08+02:00" level=debug msg="Found dependencies for dockerfile: [{go.mod /app true} {go.sum /app true} {. /app true}]"
time="2020-07-05T22:51:08+02:00" level=info msg="files modified: [shortener/internal/handler/rest/rest.go]"
我假设这意味着已检测到更改。
断点在 IDE 中正常工作,但 kubernetes 中的代码交换似乎没有发生
debug 功能故意禁用 Skaffold 的 file-watching,它会在文件更改时重建和重新部署容器。重新部署会导致现有容器终止,从而终止所有正在进行的调试会话。由于您不小心保存了对评论的更改,导致您精心构建的调试会话被拆除,这真是令人迷惑和恼火!
但我们正在研究如何在 Cloud Code 中更好地支持这种更多的迭代调试。
如果您直接使用 Skaffold,我们最近添加了通过 skaffold debug --auto-build --auto-deploy
(存在于 v1.12 中)重新启用文件监视的功能。