我正在将 Jenkins 作为 Docker 镜像运行(https://hub.docker.com/_/jenkins)从内部,我运行一个 node-12 docker 镜像作为构建容器。
我正在运行一个脚本,将新版本发布到我们本地的应用商店,该脚本在同一个 VServer 上运行。
所以现在我遇到的现象是,我无法 curl 到服务器自己的 URL。bash 脚本在我的本地计算机、VServers shell 以及其他容器 shell 中都可以完美运行。
现在出现了最奇怪的事实:我总是超时!
这并不是“无法解决”或类似的情况。
注意:ips 和 domains 替换为 , ips 替换为 Curl 命令
/ $ curl https://<my-domain>
curl: (7) Failed to connect to <my-domain> port 443: Operation timed out
/ $ curl https://example.domain
curl: (6) Could not resolve host: example.domain
/ $ curl -IL https://google.de
HTTP/2 301
NodeJS 客户端错误
(node:90) UnhandledPromiseRejectionWarning: Error: connect ETIMEDOUT <my-ip>:443
at Object._errnoException (util.js:992:11)
at _exceptionWithHostPort (util.js:1014:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
而谷歌或其他网站则没有问题。这只是自己的主机 URL。
我发现当从 jenkins shell 运行时(docker exec -it jenkins bash),我也无法 ping/curl/whatever
感谢您对修复此问题的任何建议。
// 编辑
这是 docker-compose 配置。我使用 traefik 作为反向代理。
jenkins:
image: jenkinsci/blueocean
container_name: jenkins
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- jenkins_data:/var/jenkins_home
labels:
- "traefik.port=8080"
- "traefik.frontend.rule=Host:ci.domain.example"
- "traefik.frontend.passHostHeader=true"
jenkins 使用 tini 初始化(https://github.com/krallin/tini)
"Entrypoint": [
"/sbin/tini",
"--",
"/usr/local/bin/jenkins.sh"
],
我将检查 tini 是否充当该过程的防火墙。
如果我docker exec
以 root 身份进入容器,我甚至可以 ping IP,但仍然无法 curl。
bash-4.4# ping <my-domain>
PING <my-domain> (<my-ip>): 56 data bytes
64 bytes from <my-ip>: seq=0 ttl=64 time=0.085 ms
// 编辑 2
我相信问题已经从 maven 开始,jenkins 图像基于:
https://github.com/jenkinsci/jenkins/blob/master/Dockerfile
当我使用 maven 创建一个新的 docker 容器时,我得到了与上面描述完全相同的行为。
// 编辑 3
我在容器 maven 中得到了相同的行为,并且在 openjdk 中更深一层得到了相同的行为。
docker run -it openjdk:8-jdk
使用 curl 来获取自己的主机名也会导致相同的行为。
再说一遍:我在 debian/ubuntu 上运行的任何其他容器中都没有遇到这种情况。
// 编辑 4
无法从其他虚拟服务器复制。只有这一个虚拟服务器受到影响。