码头工人→为链接容器设置通配符域名



我有两个容器:应用程序和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

一切都很好。

但我的app需要一些第三方库,它们使用虚拟主机风格的路径:

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

当然bucketname.s3是无法解决的。

我尝试在/etc/hosts中设置172.19.0.4 bucketname.s3(容器本地IP(,一切都很好。但我不能每次都为每个新的bucket更新/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解析程序(存在s3主机(来解析s3.。所以看起来唯一可能的解决方案是将DNS服务器与Docker集成,可以管理容器内部的动态IP和记录

(这可能不是最好的答案,但可能总比什么都没有好(。

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

  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服务器。这里有一些创造力的空间,我只是试着给出这个想法

最新更新