docker - skaffold 不会在 minikube 中重新加载 golang 代码

标签 docker go kubernetes minikube skaffold

我一直在尝试使用本地 minikube 安装的 skaffold。能够在尽可能接近生产的东西上开发您的项目真是太好了。
如果我使用 getting-started example在 skaffold github repo 上提供,一切正常,我的 IDE (intellij idea) 在断点处停止,当我修改代码时,更改会立即反射(reflect)出来。
现在在我的个人项目中,它比简单的 main.go 文件要复杂一些,但事情并没有按预期工作。 IDE 在断点处停止,但热代码重新加载没有发生,即使我在控制台中看到 skaffold 检测到对该特定文件所做的更改,但不幸的是这些更改没有反射(reflect)/应用。
一个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 中的代码交换似乎没有发生

最佳答案

调试功能故意禁用 Skaffold 的文件监视,它在文件更改时重建和重新部署容器。重新部署会导致现有容器终止,从而破坏任何正在进行的调试 session 。由于您不小心保存了对评论的更改,因此拆除您精心构建的调试 session 确实令人迷惑和恶化! 😫
但我们正在研究如何在 Cloud Code 中更好地支持这种更具迭代性的调试。
如果您直接使用 Skaffold,我们最近添加了通过 skaffold debug --auto-build --auto-deploy 重新启用文件监视的功能。 (存在于 v1.12 中)。

关于docker - skaffold 不会在 minikube 中重新加载 golang 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62746288/

相关文章:

docker - 没有这样的图像 : testcontainersofficial/ryuk:0. 3.0

shell - 通过从属服务器上的Jenkins Shell清洁Docker容器

docker - 代理背后的 Kubernetes Docker 容器

kubernetes - 即使 servicemonitor 可用并出现在服务发现中,Gitlab 指标也不会被 prometheus 抓取

到 AKS 的 Azure 专用链接以及到另一个 AKS 群集的专用终结点

node.js - 通过 SSH 在 Docker 中安装私有(private) npm 包

docker - Vglrun 在 Docker 容器中不起作用

docker - 为多个go.mod项目编写dockerfile

go - golang 中的( slice )变量初始值设定项中的 [...] 是什么意思?

json - 在go中解析动态json