我有两个用于 foo 服务的 Dockerfile:foo-dev 和 foo-debug。这些文件之间只有 3 行差异,其中 foo-debug 安装了 delve,允许我调试 golang 的 docker 容器。我使用 make 命令将正确的 dockerfile 发送到 docker compose。它按预期工作,但有一个怪癖。在 debug 和 dev 容器之间切换很麻烦,我需要停止容器,杀死它,然后通过将 --build 传递给 docker compose 来重建另一个容器,然后我可以运行 make 命令。有更好的策略吗?下面提供了简化的代码片段
生成文件
compose-dev:
DOCKER_FILE=foo-dev.Dockerfile docker compose up -d
compose-debug:
DOCKER_FILE=foo-debug.Dockerfile docker compose up -d
docker-compose.yml
version: '3'
services:
foo:
build:
context: .
dockerfile: ${DOCKER_FILE}
foo-dev.Dockerfile -> foo-debug.Dockerfile(差异如下所示)
FROM golang:1.20.8-bullseye as builder
+ RUN CGO_ENABLED=0 go install -ldflags "-s -w -extldflags '-static'" github.com/go-delve/delve/cmd/dlv@latest
FROM debian:bullseye-slim COPY --from=builder /go/bin/foo ./bin/foo
+ COPY --from=builder /go/bin/dlv ./bin/dlv
+ CMD [ "./bin/dlv", "--listen=:4001", "--headless=true", "--log=true", "--accept-multiclient", "--api-version=2", "exec", "./bin/foo"]
- CMD ["./bin/foo", "-debug"]
我知道 Docker Compose 提供 profiles;但是,这会导致重复的代码,其中 docker-compose.yml 将同时包含 foo-dev 服务和 foo-debug 来区分它们,但具有相同的重复子配置。
我不明白你的问题,但你的目标是什么,让你的工作流程更快,无需样板+无需更多打字?
如果你讨厌切换过程,你需要停止、终止、运行正确的文件。您可以在 makefile 中创建一些函数并进行链式调用。
dcdown:
@docker-compose down
dcstop:
@docker-compose stop
dcrerun-dev: dcstop dcdown
@DOCKER_FILE=foo-dev.Dockerfile docker compose up -d
dcrerun-debug: dcstop dcdown
@DOCKER_FILE=foo-debug.Dockerfile docker compose up -d
我的观点是,你如何创建自己的函数来传递 docker arg,你可以使用其他 bash 东西来做到这一点。
顺便说一句。运行两个容器有什么问题吗?我的意思是,如果你有硬件,那么 docker/containerd 就是相当轻量级的容器运行时引擎。