Программно создайте SSH-туннель внутри dockerized apache airflow python operator - PullRequest
0 голосов
/ 21 июня 2019

Моя программа не может создать туннель SSH, пока внутри моего док-контейнера запущен поток Apache. Работает только функция на моей локальной машине. У меня есть список серверов, которые я использую для создания туннеля, запроса к базе данных и закрытия соединения. Обычно я делал бы это следующим образом:

for server in servers:
    server_conn = sshtunnel.SSHTunnelForwarder(
        server,
        ssh_username=ssh_user,
        ssh_password=ssh_password,
        remote_bind_address=(localhost, db_port),
        local_bind_address=(localhost, localport)
    )

Это работает, как и ожидалось, и я могу делать все, что мне нужно оттуда. Однако в Docker это не работает. Я понимаю, что докер работает и привязывается к порту и фактически не является частью хост-системы, поэтому я использовал network_mode="host", чтобы помочь решить эту проблему. Однако это не работает, потому что мои контейнеры теряют способность общаться друг с другом. Вот мой docker-compose файл

    postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
            - PGDATA=/var/lib/postgresql/data/pgdata
        volumes:
            - ~/.whale/pgdata:/var/lib/postgresql/data/pgdata
            - ./dags/docker/sql/create.sql:/docker-entrypoint-initdb.d/init.sql
        ports:
          - "5432:5432"

    webserver:
        image: hawk
        build:
            context: .
            dockerfile: ./dags/docker/Dockerfile-airflow
        restart: always
        depends_on:
            - postgres
            # - redis
        environment:
            - LOAD_EX=n
            - FERNET_KEY=46BKJoQYlPPOexq0OhDZnIlNepKFf87WFwLbfzqDDho=
            - EXECUTOR=Local
        volumes:
            - ./dags:/usr/local/airflow/dags
            # Uncomment to include custom plugins
            # - ./plugins:/usr/local/airflow/plugins
        ports:
            - "8080:8080"
            - "52023:22"
        command: webserver
        healthcheck:
            test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
            interval: 30s
            timeout: 30s
            retries: 3

Я также следовал инструкциям здесь и дошел до того, что я могу docker exec в свой контейнер и вручную набрать приведенный выше фрагмент кода Python и получить работающее соединение. Кроме того, я прочитал документацию по воздушному потоку здесь , которая охватывает операторы соединения SSH, но они поддерживают только команды bash, мне понадобится моя функция python для запуска. Я действительно запутался, почему код python будет работать, когда exec находится в системе, а не когда я запускаю его через DAG с воздушным потоком. В настоящее время я не могу вручную вставить все соединения, потому что после развертывания этой системы будет> 100. Любая помощь будет принята с благодарностью. Если требуется больше глубины, пожалуйста, дайте мне знать.

...