Моя программа не может создать туннель 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. Любая помощь будет принята с благодарностью. Если требуется больше глубины, пожалуйста, дайте мне знать.