Как экспортировать результаты процесса docker в локальный файл — при подключении к хосту через ssh?

#docker #ssh

Вопрос:

Ну, учитывая, что у меня есть докер (с postgres), я мог бы сбросить данные pg_dump , используя:

 sudo docker exec <DOCKERNAME> pg_dump --data-only --table=some_table some_db
 

Я мог бы дополнительно отправить это в файл, добавив > export.sql

 sudo docker exec <DOCKERNAME> pg_dump --data-only --table=some_table some_db > export.sql
 

Наконец, это отлично работает в (интерактивном) сеансе ssh.

Однако при использовании ssh файл хранится на удаленном хосте, а не в моей локальной системе, я хочу получить файл локально, а не удаленно. Я знаю, что могу отправить команду непосредственно в оболочку ssh, а затем выполнить экспорт на локальный хост:

 ssh -p 226 USER@HOST 'command' > local.sql
 

т.е.:

 ssh -p 226 USER@HOST 'echo test' > local.sql
 

Однако при попытке объединить обе команды я получаю ошибку

 ssh -p 226 USER@HOST 'sudo docker exec <DOCKERNAME> pg_dump --data-only --table=some_table some_db' > local.sql


sudo: no tty present and no askpass program specified
 

И если я осмелюсь удалить sudo (что было бы глупо) Я получаю: sh: docker: command not found . Как мне решить эту проблему? Как я могу экспортировать дамп pg непосредственно на свой локальный компьютер? С помощью простой команды? Или, по крайней мере, без предварительного создания копии файла в удаленной системе?

Ответ №1:

Я бы избегал sudo или docker exec для этой установки.

Во-первых, убедитесь, что ваш контейнер базы данных имеет порт, опубликованный на хосте. В Docker Compose, например:

 version: '3.8'
services:
  db:
    image: postgres
    ports:
      - '127.0.0.1:11111:5432'
 

Второй номер порта должен быть обычным портом PostgreSQL 5432; первый номер порта может быть любым, который не конфликтует; 127.0.0.1 параметр делает опубликованный порт доступным только в локальной системе.

Затем, при подключении к удаленной системе, вы можете использовать ssh для настройки прямого порта:

 ssh -L 22222:localhost:11111 -N me@remote.example.com
 

ssh -L настраивает переадресацию порта из локальной системы в удаленную систему; ssh -N говорит, чтобы не запускать команду, просто выполните переадресацию порта.

Теперь в вашей локальной системе вы можете запускать psql и другие подобные клиентские инструменты. Локально localhost:22222 подключается к ssh-туннелю; который перенаправляется localhost:11111 в удаленную систему; и который перенаправляется на порт 5432 в контейнере.

 pg_dump --port=22222 --data-only --table=some_table some_db > export.sql
 

Если у вас есть возможность прямого подключения к хосту базы данных, вы можете удалить 127.0.0.1 его из ports: настройки, а затем pg_dump --host=remote.example.com --port=11111 без ssh туннеля. (Но я предполагаю, что это не просто так.)

Комментарии:

1. э — э, я никак не могу изменить настройку докера postgres-я действительно должен использовать docker exec для этого. Ssh-туннель существует, так как postgres в любом случае доступен только с удаленного сервера для других докеров. — Это также связано с тем, что на моем локальном компьютере для разработки нет двоичных файлов postgres, они все равно будут находиться во (временном) докере во время тестов.

Ответ №2:

Вы можете перенаправлять соединения сокетов ssh , а затем подключаться к контейнеру с вашего хоста, если вы установили docker :

 ssh -n -N -T -L ${PWD}/docker.sock:/var/run/docker.sock user@host amp;
docker -H unix://${PWD}/docker.sock exec ...