Как запустить несколько экземпляров VS Code, чтобы использовать разные идентификаторы для взаимодействия с удаленным репозиторием git при работе с удаленными контейнерами? - PullRequest
1 голос
/ 06 мая 2020

Извините за длинный пост

У меня есть установка удаленной разработки VS Code с использованием контейнеров. У меня есть несколько учетных записей пользователей на одном сервере git. Я использую аутентификацию на основе ключей для взаимодействия с git -сервером. Я использую Ubuntu 18.04 LTS на своем хост-компьютере и Debian Buster в контейнерах.

Git Server - git.server.com
Git urls 
 - git@git.server.com:repo1.git
 - git@git.server.com:repo2.git

Repo1 is used by User1 account
Repo2 is used by User2 account

ssh-key for User1 - ~/.ssh/id_ed25519_user1
ssh-key for User2 - ~/.ssh/id_ed25519_user2

Я создал конфигурацию s sh в ~ / .ssh / config

Host user1.git.server.com
    HostName git.server.com
    User git
    IdentityFile /home/user/.ssh/id_ed25519_user1
    IdentitiesOnly yes

Host user2.git.server.com
    HostName git.server.com
    User git
    IdentityFile /home/user/.ssh/id_ed25519_user2
    IdentitiesOnly yes

С терминала на хост-машине я могу аутентифицироваться на сервере

как user1:

ssh git@user1.git.server.com

как user2:

ssh git@user2.git.server.com

Я могу запускать несколько экземпляров кода vs и внутри терминал vs code (не открывая папку в удаленном контейнере), я могу использовать приведенные выше команды для аутентификации.

Все становится интересно, когда мы используем «Reopen in Containers». У меня нет папки .ssh / config, смонтированной внутри контейнеров, поэтому приведенные выше команды не могут выполняться из-за ошибки:

Could not resolve hostname user1.git.server.com: Name or service not known
or
Could not resolve hostname user2.git.server.com: Name or service not known

Я не хочу монтировать свою ./ssh папку в контейнеры для очевидного причины. Также mount=type=ssh также невозможно, так как это не создание контейнера, а работа с контейнером в качестве среды разработки.

Следующее, что я замечаю, это то, что s sh -agent forwarding работает.

ssh-add -l

Если я выполняю указанную выше команду в терминале на хосте, терминал в коде vs (когда папка открывается локально) и терминал в коде vs (когда папка открывается в удаленном контейнере) все возвращают один и тот же результат (отпечаток пальца для ключей идентификаторов для user1 и user2).

Итак, я запускаю новый s sh -agent в хост-терминале перед запуском кода.

~/repo1$ eval `ssh-agent -s`
~/repo1$ ssh-add ~/.ssh/id_ed25519_user1
~/repo1$ code .

and in another terminal
~/repo2$ eval `ssh-agent -s`
~/repo2$ ssh-add ~/id_ed25519_user2
~/repo2$ code .

В соответствующем хост-терминале и терминале vs code (не открывая папку в удаленном контейнере) получаю желаемый результат. Я могу использовать:

ssh git@git.server.com

Так что мне больше не нужен файл sh -config. Но это не работает, когда папка открыта в удаленном контейнере. VS Code подключается только к первому запущенному s sh -агенту. То есть (в данном случае) repo1, открытый в VS Code Remote Container, отлично работает со всей поддержкой git, но repo2, открытый в VS Code Remote Container, не работает.

Как я могу указать VS Code для использования, который s sh -агент для пересылки в контейнер при переключении на удаленный контейнер?

Обходной путь

Временное решение, которое я использую в настоящее время, - это использовать агент s sh по умолчанию (Ubuntu запускает s sh -агент на момент входа в систему). Этот агент уже содержит оба удостоверения. Проверьте, запустив

ssh-add -l

. Запустите несколько экземпляров кода vs как обычно и переключитесь на удаленный контейнер. Когда я хочу выполнить операцию git, я делаю следующее в хост-терминале:

For repo1 (user1) operations
$ ssh-add -D
$ ssh-add ~/.ssh/id_ed25519_user1

For repo2 (user2) operations
$ ssh-add -D
$ ssh-add ~/.ssh/id_ed25519_user2

Есть ли другой предлагаемый способ? Есть ли какие-либо настройки, которые можно добавить в devcontainer. json для правильной пересылки s sh -agent?

Спасибо за ваше терпение.

...