Docker Compose → 为链接的容器设置通配符域名

4

我有两个容器:应用程序和 MINIO 服务。

假设 docker-compose.yml 文件如下:

version: "3"

services:
  s3:
    image: minio/minio:RELEASE.2021-11-09T03-21-45Z
    expose:
     - "9000"
     - "9001"
    container_name: s3
    command: server /data --console-address ":9001"
    environment:
     - MINIO_DOMAIN=s3
     - MINIO_ROOT_USER=some_user
     - MINIO_ROOT_PASSWORD=some_password
    healthcheck:
     test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
     interval: 30s
     timeout: 20s
     retries: 3
    volumes:
     - /tmp/data:/data

  app:
    image: my_image
    container_name: app
    build:
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - s3

app 容器通过 http://s3:9000 端点URL连接到 MINIO

当我运行时:

aws --profile myprof --endpoint-url="http://s3:9000" s3 ls  s3://bucketname/path/to/file

一切都正常。

但是我应用程序需要使用虚拟主机样式的路径,因此需要一些第三方库:

http://bucketname.s3:9000/path/to/file

当然,bucketname.s3 无法解析。

我尝试在 /etc/hosts 中设置 172.19.0.4 bucketname.s3 (容器本地 IP),一切正常。 但是我无法为每个新桶更新 /etc/hosts

所以,有没有办法在 Docker 中设置通配符主机名 *.s3

我的应用程序使用 python:3.7.0-alpine 镜像。

cat /etc/resolv.conf 的结果是:

nameserver 127.0.0.11
options edns0 ndots:0

看起来可以使用 Dockerfile 在本地主机解析服务中设置域名,有没有什么方法可以实现?

备忘录添加于2022/01/25

我将网络别名添加到 s3 容器作为临时解决方案,以便在 docker-compose up -d 时添加精确的存储桶名称,但这并不是一个解决方案,因为我仍然无法在不重启容器的情况下动态创建新的存储桶:

version: "3"

services:
  s3:
    image: minio/minio:RELEASE.2021-11-09T03-21-45Z
    expose:
     - "9000"
     - "9001"
    container_name: s3
    command: server /data --console-address ":9001"
    environment:
     - MINIO_DOMAIN=s3
     - MINIO_ROOT_USER=some_user
     - MINIO_ROOT_PASSWORD=some_password
    healthcheck:
     test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
     interval: 30s
     timeout: 20s
     retries: 3
    volumes:
     - /tmp/data:/data
    networks:
      default:
        aliases:
         - bucketone.s3
         - buckettwo.s3

我尝试在外部分离的 DNS 服务器中设置记录:

*.s3  IN CNAME  s3.

但是这种方式也不起作用。看起来容器试图通过相同的DNS服务器解析,而不是使用Docker内部的DNS解析器(其中主机存在)。 因此,看起来唯一可能的解决方案是设置与Docker集成的DNS服务器,该服务器可以管理容器内部动态IP和记录。
1个回答

0

(这可能不是最好的答案,但可能比没有好)。

我已经在主机系统上有一个自定义DNS服务器(在我的情况下是Acrylic)。我所做的快速修复:

  1. 从依赖应用程序容器中:ping anotherservice.loc(获取服务容器的IP,在我的情况下是172.18.0.7)
  2. 在自己的DNS服务器上,添加一个条目172.18.0.7 *.anotherservice.loc并重新启动DNS
  3. 可选地,清除主机系统DNS缓存:ipconfig /flushdns(此命令适用于Windows)

理论上:

  • 也许你可以在docker-compose.yml中硬编码这个IP,以避免编辑DNS设置的需要,以防Docker在未来更改它。或者,
  • 也许你可以在依赖容器内找到并设置一个自定义DNS服务器。这里有一些创意空间,我只是试图给出这个想法。

谢谢你的回答。最稳定的方法是为容器设置静态内部IP,并将永久通配符记录添加到DNS服务器中,但这可能会在未来引起严重问题。而且我真的不喜欢使用静态IP地址。在动态IP地址的情况下,在重新构建容器时每次重启DNS服务器可能会对整个服务造成巨大的不稳定性(可能会导致单点故障)。这对于开发环境仍然很好,但对于生产环境不适用。因此,我决定限制存储桶的名称,并向其添加别名。可能带有自己解析器的k8s可以解决这个问题。 - rzlvmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接