Golang开发中如何检查容器运行状态

Golang开发中如何检查容器运行状态 我在开发一个Go应用程序,并希望在开发完成前启动一个容器来检查其运行情况。 然而,由于开发的代码尚未合并到主分支,go build 命令会执行失败。 但是,我又不能将未经测试的代码合并到主分支。 如果您能告诉我这种情况下最佳实践是什么,我将不胜感激。 以下是我的Dockerfile。

FROM golang:1.18 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY main.go ./

ARG CGO_ENABLED=0
ARG GOOS=linux
ARG GOARCH=amd64
RUN go build \
    -o /go/bin/main \
    -ldflags '-s -w'

FROM scratch as runner

COPY --from=builder /go/bin/main /app/main

ENTRYPOINT ["/app/main"]

更多关于Golang开发中如何检查容器运行状态的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好。这取决于你如何构建你的镜像。是在CI中还是在本地构建的?你能提供更多细节吗?

更多关于Golang开发中如何检查容器运行状态的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在这种情况下,最佳实践是使用多阶段构建的分离测试模式。你可以创建一个专门用于测试的Dockerfile,或者修改现有Dockerfile来支持开发阶段的构建。

以下是两种解决方案:

方案一:创建独立的测试Dockerfile

# Dockerfile.test
FROM golang:1.18 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY main.go ./

# 仅编译,不构建完整二进制文件
RUN go build -o /dev/null ./...

FROM alpine:latest as test-runner
WORKDIR /app
COPY --from=builder /go/src/main.go .
# 这里可以添加测试容器运行状态的逻辑
CMD ["echo", "容器构建成功,可以运行测试"]

然后使用以下命令构建测试容器:

docker build -f Dockerfile.test -t myapp-test .
docker run --rm myapp-test

方案二:修改现有Dockerfile支持条件构建

FROM golang:1.18 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY main.go ./

# 添加构建参数控制构建行为
ARG BUILD_MODE=production
ARG CGO_ENABLED=0
ARG GOOS=linux
ARG GOARCH=amd64

# 根据构建模式执行不同操作
RUN if [ "$BUILD_MODE" = "test" ]; then \
        go build -o /go/bin/test-main ./... && \
        echo "测试构建完成"; \
    else \
        go build -o /go/bin/main -ldflags '-s -w' && \
        echo "生产构建完成"; \
    fi

FROM scratch as runner

ARG BUILD_MODE=production
COPY --from=builder /go/bin/main /app/main

# 测试模式下使用不同的入口点
ENTRYPOINT ["/app/main"]

使用测试模式构建:

docker build --build-arg BUILD_MODE=test -t myapp-test .

方案三:使用Go测试容器状态(推荐)

创建一个专门的测试程序来检查容器状态:

// test_container.go
package main

import (
    "context"
    "fmt"
    "log"
    "time"
    
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
    if err != nil {
        log.Fatal(err)
    }

    // 检查容器运行状态
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("运行中的容器数量: %d\n", len(containers))
    for _, container := range containers {
        fmt.Printf("容器ID: %s, 状态: %s\n", container.ID[:12], container.State)
    }
}

对应的测试Dockerfile:

FROM golang:1.18 as test-builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY test_container.go ./

RUN go build -o /go/bin/test-container test_container.go

FROM alpine:latest
RUN apk add --no-cache docker-cli
COPY --from=test-builder /go/bin/test-container /app/test-container
CMD ["/app/test-container"]

构建并运行测试:

# 构建测试容器
docker build -t container-checker .

# 运行测试(需要挂载Docker socket)
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock container-checker

方案四:使用docker-compose进行集成测试

创建docker-compose.test.yml:

version: '3.8'
services:
  app-test:
    build:
      context: .
      dockerfile: Dockerfile.test
    container_name: myapp-test-container
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

然后运行:

docker-compose -f docker-compose.test.yml up --build
# 检查容器状态
docker-compose -f docker-compose.test.yml ps

这些方案允许你在不合并到主分支的情况下测试容器构建和运行状态,同时保持生产Dockerfile的完整性。

回到顶部