如何获取本地MinIO容器的完整S3-API URL并传入后端容器?
解决容器内访问MinIO S3-API的主机名解析问题
核心问题分析
Docker Compose默认会为所有服务创建自定义网络,同网络内的容器本应能通过服务名(比如minio)互相解析。你遇到的主机名无法生效问题,大概率不是DNS解析故障,而是@smithy客户端的配置不符合MinIO的运行要求。
方案1:修复@smithy客户端配置(优先推荐)
MinIO默认采用路径样式存储(示例:http://minio:9000/bucket/object),而AWS SDK(包括@smithy)默认使用虚拟主机样式;同时MinIO容器默认用HTTP而非HTTPS,需要显式禁用TLS。修改你的代码配置如下:
/* Set up the s3 store to pass to the tus server */ const datafileS3Store = new S3Store({ s3ClientConfig: { bucket: process.env.DATAFILE_BUCKET, region: "eu-west-2", endpoint: process.env.MINIO_ENDPOINT, // 保持http://minio:9000不变 credentials: { accessKeyId: process.env.MINIO_USERNAME, secretAccessKey: process.env.MINIO_PASSWORD, }, forcePathStyle: true, // 强制使用路径样式,适配MinIO tls: false, // 禁用TLS,匹配MinIO默认HTTP配置 }, })
修改后重启服务,即可通过http://minio:9000正常访问MinIO的S3-API。
方案2:给MinIO分配固定IP(备选)
如果必须使用IP而非服务名,可以在Docker Compose中自定义子网并为MinIO指定固定IP,避免每次启动IP变动:
修改docker-compose.yml:
version: '3.9' # 自定义网络并指定子网 networks: app-net: ipam: config: - subnet: 172.21.0.0/16 services: backend: build: ./backend/tus/. container_name: backend ports: - "8181:8181" environment: - MINIO_ENDPOINT=http://172.21.0.10:9000 # 用固定IP作为端点 depends_on: - minio networks: - app-net # 加入自定义网络 minio: image: quay.io/minio/minio container_name: minio command: server /data --console-address ":9001" environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin volumes: - minio_data:/data ports: - "9000:9000" - "9001:9001" networks: app-net: ipv4_address: 172.21.0.10 # 为MinIO指定固定IP
配置后MinIO的IP会固定为172.21.0.10,后端容器可直接用该IP访问,无需担心IP变化。
验证方法
若不确定是DNS问题还是配置问题,可进入后端容器验证服务名解析:
# 进入backend容器 docker exec -it backend /bin/sh # 尝试ping minio,查看是否能解析到IP ping minio
如果能ping通,说明DNS正常,直接用方案1修复配置即可。
内容的提问来源于stack exchange,提问作者WhatTheWhat
相关产品推荐
相关产品推荐

