Docker镜像构建时安装Curl并解决VB.NET应用调用Curl无响应问题
问题根源
- 多
FROM语句用法错误:Docker多阶段构建要求必须显式从前面的阶段复制文件到最终阶段,否则前面声明的镜像完全不会生效,你的最终镜像仅包含最后一个mcr.microsoft.com/dotnet/framework/runtime:4.6.2的内容,前面声明的curl镜像无任何作用 curlimages/curl:latest是Linux容器镜像,和Windows容器不兼容,即使按多阶段构建逻辑复制文件,也无法拿到Windows可用的curl二进制文件- 原有VB代码中
cmd启动参数用了/k,命令执行完成后cmd会保持驻留,不会输出结果也不会退出,即使curl配置正确也看不到返回内容
解决方案
方案1:修改Dockerfile配置curl,保留原有VB代码逻辑
第一步修改VB代码
把启动参数里的/k改为/c,确保命令执行后cmd退出、结果正常输出:
Module Module1 Sub Main() Dim curlApplicationPath = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "curl.exe") Dim arguments = $"/c {curlApplicationPath} --location --request GET http://ip:port/" Process.Start("cmd.exe", arguments) End Sub End Module
第二步修改Dockerfile
直接在.NET Framework基础镜像中下载Windows版curl,放到系统目录适配代码的路径逻辑:
FROM mcr.microsoft.com/dotnet/framework/runtime:4.6.2 WORKDIR /app # 下载curl并解压到System32目录 RUN powershell -Command ` Invoke-WebRequest -Uri "https://curl.se/windows/dl-7.79.1/curl-7.79.1-win64-mingw.zip" -OutFile "curl.zip" ; ` Expand-Archive -Path "curl.zip" -DestinationPath "C:\temp" ; ` Copy-Item "C:\temp\curl-7.79.1-win64-mingw\bin\curl.exe" -Destination "C:\Windows\System32\curl.exe" ; ` Remove-Item -Recurse -Force "C:\temp", "curl.zip" COPY bin/Release . ENTRYPOINT ["CurlCall.exe"]
重新构建镜像后即可正常运行。
方案2(更推荐):替换curl调用逻辑,无需额外依赖
直接使用.NET自带的HttpClient发起请求,完全不需要依赖外部curl程序,兼容性更强、性能更高:
修改VB代码
Imports System.Net.Http Module Module1 Private ReadOnly client As New HttpClient() Sub Main() Dim response As HttpResponseMessage = client.GetAsync("http://ip:port/").Result response.EnsureSuccessStatusCode() Dim responseBody As String = response.Content.ReadAsStringAsync().Result Console.WriteLine(responseBody) End Sub End Module
对应简化版Dockerfile
FROM mcr.microsoft.com/dotnet/framework/runtime:4.6.2 WORKDIR /app COPY bin/Release . ENTRYPOINT ["CurlCall.exe"]
内容的提问来源于stack exchange,提问作者SAIP
相关产品推荐
相关产品推荐

