Блестящий сервер не раскрывает порт 3838 при развертывании в Docker Swarm - PullRequest
0 голосов
/ 05 февраля 2019

У нас есть куча приложений Shiny, которые уже более года работают с использованием Docker в режиме роя.Несколько недель назад, при развертывании новых приложений Shiny (или даже точных копий существующих приложений), при запросе к ним мы получаем ошибку «Bad Gateway» из приложения Traefik, которое обрабатывает обратный прокси-сервер.

С некоторой помощью инженеров из Docker EE мы определили проблему как службу Shiny, не открывающую порт 3838 в контейнере приложения.Мы убедились, что служба Traefik настроена и работает должным образом, и существующие приложения на рое, использующие Traefik в сочетании с образом Rocker / Geospatial Docker, работали в течение нескольких недель / месяцев без проблем.Эта проблема «Bad Gateway» возникает только тогда, когда мы развертываем новые приложения, используя Shiny, на порту 3838 или повторно разворачиваем существующие (неизмененные) приложения.

Вы можете просмотреть отфильтрованные журналы из службы 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.

Теперь взгляните на QAконтейнер возвращает ошибку «Bad Gateway» при запросе URL.Вы заметите, что здесь порт 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, которая не изменилась за год.Версия Prod вышеупомянутого приложения точно такая же, как версия QA, просто версия QA была развернута недавно, а версия Prod работала уже несколько месяцев.Нет никаких отличий от сценариев развертывания, лежащих в основе Rocker / Geospatial image, ничего ...

Вот 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 "$@"

Мы боролись с этим неделями и, наконец, сосредоточились наБлестящее приложение не отображает порт 3838. Но мы не можем понять, почему ... Ничего не изменилось ни в одном коде, даже установка Docker EE не изменилась с августа.

...