如何在使用相同服务名的 Docker 容器之间切换?

问题描述 投票:0回答:1

我有两个用于 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 来区分它们,但具有相同的重复子配置。

docker docker-compose makefile dockerfile
1个回答
0
投票

我不明白你的问题,但你的目标是什么,让你的工作流程更快,无需样板+无需更多打字?

如果你讨厌切换过程,你需要停止、终止、运行正确的文件。您可以在 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 就是相当轻量级的容器运行时引擎。

© www.soinside.com 2019 - 2024. All rights reserved.