Docker-Compose+Minio环境下UnknownHostException问题求助
Minio本地测试UnknownHostException问题排查
背景
通过Docker-Compose部署Minio与业务应用开展S3本地测试:
- 本地Linux机器可正常访问Minio控制台
- 调用业务应用
archive-api-app的API时,抛出UnknownHostException: alc-vbox-testarchiveservice.minio - 目标桶名为
alc-vbox-testarchiveservice
Docker-Compose配置文件
version: "2.1" services: minio: image: minio/minio container_name: minio ports: - 9001:9001 volumes: - minio_storage:/data environment: MINIO_ACCESS_KEY: minio MINIO_SECRET_KEY: minio123 MINIO_REGION: us-east-1 command: server /data --console-address ":9001" mem_limit: 512m populate-minio-data: container_name: "minio-data" image: minio/mc volumes: - ./hello.txt:/tmp/hello.txt entrypoint: > /bin/sh -c " /usr/bin/mc config host rm local; /usr/bin/mc config host add --quiet --api s3v4 local http://minio:9001 minio minio123; /usr/bin/mc mb --quiet local/somebucketname1/; /usr/bin/mc policy set public local/somebucketname1; /usr/bin/mc cp /tmp/hello.txt local/somebucketname1/hello.txt; " depends_on: - minio archive-api-app: image: openjdk:11 container_name: "archive-api-app" ports: - 8091:6001 volumes: - /home/apcuser/dev/projects/ea-archive-service-v2/projects/application/archive-api:/app command: [ 'java', '-jar', '/app/build/libs/archive-api-1.0.0.jar' ] env_file: - ./vars/default.env volumes: minio_storage:
AmazonS3客户端配置代码
@Bean public AmazonS3 getS3Client() { return AmazonS3ClientBuilder.standard() .withClientConfiguration(new ClientConfiguration().withMaxConnections(maxConnections) .withConnectionTimeout(connectionTimeout).withMaxErrorRetry(maxRetry)) .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://minio:9001", "us-east-1")) .build(); }
错误日志片段
archive-api | at java.base/java.lang.Thread.run(Thread.java:829) archive-api | Caused by: java.net.UnknownHostException: alc-vbox-testarchiveservice.minio archive-api | at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797) archive-api | at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1519) archive-api | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1378) archive-api | at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1306) archive-api | at com.amazonaws.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:27) archive-api | at com.amazonaws.http.DelegatingDnsResolver.resolve(DelegatingDnsResolver.java:38) archive-api | at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112) archive-api | at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) archive-api | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) archive-api | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) archive-api | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) archive-api | at java.base/java.lang.reflect.Method.invoke(Method.java:566) archive-api | at com.amazonaws.http.conn.ClientConnectionManagerFactory$Handler.invoke(ClientConnectionManagerFactory.java:76) archive-api | at com.amazonaws.http.conn.$Proxy97.connect(Unknown Source) archive-api | at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393) archive-api | at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) archive-api | at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) archive-api | at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) archive-api | at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) archive-api | at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) archive-api | at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) archive-api | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1346) archive-api | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157) archive-api | ... 77 more
问题原因
这是由于Amazon S3客户端默认采用虚拟主机样式(Virtual Host Style)构造请求地址:当访问名为alc-vbox-testarchiveservice的桶时,客户端会自动将请求地址拼接为alc-vbox-testarchiveservice.minio,而非http://minio:9001/alc-vbox-testarchiveservice这种路径样式(Path Style)格式。
在Docker Compose默认网络中,仅minio主机名可被正常解析,alc-vbox-testarchiveservice.minio这个组合域名不存在,因此触发DNS解析失败,抛出UnknownHostException。
解决方案
方案1:强制启用路径样式访问(推荐本地测试使用)
修改AmazonS3客户端配置,添加.withPathStyleAccessEnabled(true),强制客户端使用路径样式构造请求地址:
@Bean public AmazonS3 getS3Client() { return AmazonS3ClientBuilder.standard() .withClientConfiguration(new ClientConfiguration().withMaxConnections(maxConnections) .withConnectionTimeout(connectionTimeout).withMaxErrorRetry(maxRetry)) .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://minio:9001", "us-east-1")) .withPathStyleAccessEnabled(true) // 启用路径样式访问 .build(); }
修改后,客户端会以http://minio:9001/alc-vbox-testarchiveservice格式发起请求,避免生成无法解析的虚拟主机域名。
方案2:配置自定义域名与DNS映射(适合生产环境)
若需保留虚拟主机样式访问,可按以下步骤操作:
- 在Minio中配置桶的自定义域名
- 在业务应用容器的
/etc/hosts中添加映射规则:alc-vbox-testarchiveservice.minio [Minio容器IP]
此方式配置相对复杂,本地测试不推荐。
内容的提问来源于stack exchange,提问作者Anshita Singh
相关产品推荐
相关产品推荐

