我有两个容器:应用程序和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服务器(在我的情况下,是丙烯酸(。我所做的快速修复:
- 来自依赖的应用程序容器:
ping anotherservice.loc
(要获取服务容器的IP,在我的情况下为172.18.0.7( - 在自己的DNS服务器上,添加一个条目
172.18.0.7 *.anotherservice.loc
并重新启动DNS - 可以选择清除主机系统DNS缓存:
ipconfig /flushdns
(此命令适用于Windows(
理论上:
- 也许你可以在
docker-compose.yml
中硬编码这个IP,以避免需要编辑DNS设置,以防Docker将来更改它。或者 - 也许你可以在依赖的容器中找到并设置一个自定义的DNS服务器。这里有一些创造力的空间,我只是试着给出这个想法