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,自然无法解析。
具体排查与修复步骤:
- 检查Java代码中构建YouTube请求地址的逻辑,重点看字符串拼接部分,是否存在将域名与布尔变量(或字面量"true")直接拼接的错误,比如类似
"www.youtube.com" + true的写法 - 修正拼接逻辑,确保域名是正确的
www.youtube.com(或带协议的https://www.youtube.com),参数或标记需正确附加在URL路径或查询参数中,而非直接拼在域名后 - 同步检查本地代码与容器内运行代码的一致性,本地运行正常可能是因为代码分支、配置文件或本地环境的特殊处理掩盖了这个拼接错误
内容的提问来源于stack exchange,提问作者NiharGht
相关产品推荐
相关产品推荐

