#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 ...