Моя программа не может создать туннель SSH, пока внутри моего контейнера докеров работает apache airflow. Только запуск функции на моем локальном компьютере работает нормально. У меня есть список серверов, которые я использую для создания туннеля, запроса к базе данных и закрытия соединения. Обычно я делаю это следующим образом:
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"
, чтобы смягчить эту проблему. Однако это не работает, потому что мои контейнеры теряют возможность взаимодействовать друг с другом. Вот мой файл для создания докеров
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
вводить container и вручную введите приведенный выше фрагмент Python и получите рабочее соединение. Кроме того, я прочитал документацию по воздушному потоку здесь который охватывает операторы соединения SSH, но они поддерживают только команды bash, мне понадобится моя функция python для запуска. Я действительно смущен, почему код Python будет работать, когда exec
будет введен в систему, но не когда я запускаю его через свою DAG воздушного потока. В настоящее время я не могу вручную установить все соединения, потому что после развертывания этой системы их будет > 100. Любая помощь будет принята с благодарностью. Если требуется больше глубины, пожалуйста, дайте мне знать.