我们有大量的Shiny应用程序已经使用Swarm模式在Docker上运行了一年多。几周前,当部署新的Shiny应用程序(甚至是现有应用程序的精确副本)时,在查询它们时,我们从处理反向代理的Traefik应用程序中收到“错误网关”错误。
在Docker EE工程师的一些帮助下,我们将问题确定为Shiny服务未在应用容器中打开端口3838。我们已经验证了Traefik服务已正确配置并运行,并且使用Traefik结合Rocker / Geospatial Docker镜像在群集中现有的应用程序已经运行了数周/数月,没有出现问题。仅当我们在端口3838上使用Shiny部署新应用程序或重新部署现有(未修改)应用程序时,才会出现“错误网关”问题。
当查询一个有问题的应用程序时,您可以从Traefik服务中看到过滤的日志:
traefik_traefik.0.en3n1fjgtdc1@mcsfvlidokas01b.XXX.com | time="2019-02-05T16:25:57Z" level=warning msg="Error forwarding to http://10.1.0.175:3838, err: dial tcp 10.1.0.175:3838: getsockopt: connection refused"
对Docker容器/网络的检查表明,从Traefik到包含问题应用程序的Docker容器的连接有效。但是,此问题是,已指示Shiny侦听端口3838,但是在部署它时,它不会打开该端口。这是问题应用程序的prod版本的转储,该版本已经运行了数月而没有任何问题(请注意,端口3838已打开,应该打开):
sudo docker exec 68dfad0b1d03 ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:8787 *:*
LISTEN 0 128 127.0.0.11:35476 *:*
LISTEN 0 128 *:3838 *:* users:(("shiny-server",pid=128,fd=10))
sudo docker logs 68dfad0b1d03
[fix-attrs.d] applying owners & permissions fixes...
[fix-attrs.d] 00-runscripts: applying...
[fix-attrs.d] 00-runscripts: exited 0.
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] add: executing...
Nothing additional to add
[cont-init.d] add: exited 0.
[cont-init.d] userconf: executing...
[cont-init.d] userconf: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
现在查看查询其URL时返回“错误网关”错误的QA容器。您会注意到这里的端口3838未打开:
sudo docker exec 585956a64670 ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:8787 *:*
LISTEN 0 128 127.0.0.11:44543 *:*
sudo docker logs 585956a64670
[fix-attrs.d] applying owners & permissions fixes...
[fix-attrs.d] 00-runscripts: applying...
[fix-attrs.d] 00-runscripts: exited 0.
[fix-attrs.d] done.
[cont-init.d] executing container initialization scripts...
[cont-init.d] add: executing...
Nothing additional to add
[cont-init.d] add: exited 0.
[cont-init.d] userconf: executing...
[cont-init.d] userconf: exited 0.
[cont-init.d] done.
[services.d] starting services
[services.d] done.
我们使用的是Rocker / Geospatial图像的3.4.1版本,它在整整一年中都没有变化。上面应用的产品版本与质量检查版本完全相同,只是质量检查版本是最近才部署的,产品版本已经启动并运行了几个月。部署脚本,基本的Rocker / Geospatial映像没有区别,没什么...
这里是Dockerfile
,用于部署两个版本的应用程序:
version: '3'
services:
pm_app:
image: gitlab.XXX.com:5005/gaashiny/implementationreport:${APP_ENV}
environment:
- APP_ENV=${APP_ENV}
volumes:
- /ABCXYZ/global:/ABCXYZ/global
networks:
- traefik_public
deploy:
placement:
constraints: [node.role == worker]
mode: replicated
replicas: 1
labels:
traefik.port: 3838
traefik.frontend.rule: Host:implementation.${APP_ENV}.gswarm.XXX.com
traefik.docker.network: traefik_public
networks:
traefik_public:
external: true
这是shiny-server.conf
文件:
run_as shiny;
server {
listen 3838;
location / {
app_dir /srv/shiny-server/implementation;
log_dir /ABCXYZ/global/srv/implementation/log;
}
}
最后是start_shiny.sh
文件:
#!/bin/bash
echo "export GAAMAHI_APP_ENV=$APP_ENV" >> /etc/profile
eval "$@"
我们为此进行了数周的努力,终于在Shiny应用程序中将其归零,但未公开3838端口。但是我们不知道为什么...任何代码都没有改变,即使Docker EE安装也没有自八月以来没有改变。