You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署OpenJDK11 Alpine-Jre应用遇UnknownHostException求助

Java应用Docker化后无法连接YouTube:UnknownHostException问题排查

问题描述

本地可正常运行的Java应用,功能为拉取YouTube数据并存储到本地文件。Docker化后,容器内尝试HTTP连接youtube.com时抛出UnknownHostException异常。

使用的Dockerfile

FROM maven:3.8 AS build
RUN mkdir /usr/src/project
COPY . /usr/src/project
WORKDIR /usr/src/project
RUN mvn clean install -DskipTests

FROM adoptopenjdk/openjdk11:alpine-jre
RUN mkdir /project
WORKDIR /project
RUN mkdir sharedZone
COPY --from=build /usr/src/project/target/YouTubePlaylistPuller-1.0-SNAPSHOT-jar-with-dependencies.jar /project/
COPY ./entrypoint.sh /project/
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["/project/entrypoint.sh"] # Entrypoint is java -jar with $@

抛出的异常信息

java.lang.RuntimeException: java.net.UnknownHostException: www.youtube.comtrue
    at impl.MyApiMultithreaded$MyRunnableDataPuller.run(MyApiMultithreaded.java:77)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.net.UnknownHostException: www.youtube.comtrue
    at java.base/java.net.InetAddress$CachedAddresses.get(InetAddress.java:797)
    at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:883)
    at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1519)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1378)
    at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1306)
    at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at impl.MyApi.pullData(MyApi.java:23)
    at impl.MyApiMultithreaded$MyRunnableDataPuller.run(MyApiMultithreaded.java:75)
    ... 3 more

Docker运行命令

docker run -it --network=host --add-host='myMachineHostName':127.0.0.1 -u 1000 -v /root/sharedFolder/:/project/sharedZone/ youtube-test-23 /project/sharedZone/inputs/1.properties

已尝试的解决方法

  • DNS修正:参考方案调整容器内/etc/hosts和/etc/resolv.conf,配置正常但无效
  • 设置主机名与--add-host参数,问题未解决
  • 确认127.0.0.1 localhost配置,无论是否使用--network=host均报错
  • Docker运行时指定DNS,无效

解决方案

从异常信息里的www.youtube.comtrue可以直接定位问题:域名被错误拼接了字符串"true",导致实际请求的主机名是无效的www.youtube.comtrue,自然无法解析。

具体排查与修复步骤:

  1. 检查Java代码中构建YouTube请求地址的逻辑,重点看字符串拼接部分,是否存在将域名与布尔变量(或字面量"true")直接拼接的错误,比如类似"www.youtube.com" + true的写法
  2. 修正拼接逻辑,确保域名是正确的www.youtube.com(或带协议的https://www.youtube.com),参数或标记需正确附加在URL路径或查询参数中,而非直接拼在域名后
  3. 同步检查本地代码与容器内运行代码的一致性,本地运行正常可能是因为代码分支、配置文件或本地环境的特殊处理掩盖了这个拼接错误

内容的提问来源于stack exchange,提问作者NiharGht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:45:44