External Publication
Visit Post

Share .ssh/config with your devcontainer

DEV Community [Unofficial] June 25, 2026
Source

How to share your ~/.ssh/config with devcontainers

The purpose is to enable using git with your provider directly from the devcontainer.

The problem is when running on mac-OS you typically add UseKeychain yes to your config file. Which is a mac specific setting killing your ssh agent.

MacOS - first

Your ~/.ssh folder probably looks something like this:

❯ tree
.
├── config
├── hetzner_id_ed25519
├── hetzner_id_ed25519.pub
├── known_hosts
├── known_hosts.old
├── README.md
├── sukkerfrit.github
├── sukkerfrit.github.pub
└── test.sh

And the content of your config something like this:

Host tahh
    HostName github.com
    User git
    AddKeysToAgent yes
    IdentityFile ~/.ssh/sukkerfrit.github
    IdentitiesOnly yes
    ForwardAgent yes

Host hetzner-ktk-test
    HostName xx.xx.xx.xx
    User root
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/hetzner_id_ed25519

UseKeychain Is a mac-OS specific SSH setting. We use it to save and fetch the SSH-key passphrase automatically.

BUT it doesn't work on Linux and will actually course an exception on load rendering using eg. git directly from your devcontainer impossible.

This image is just working on root which i normally never do. I use to create a container-user in my container - I guess I was just lazy today.

This is way I share my ~/.ssh/config with devcontainers.

1. Add host's ~/.ssh to docker as mount

My 'trick' is to just mount my host's .ssh folder as read only - but to eg. /root/.sshtemplate.

Then you don't end up editing your host's config.

devcontainer.json

{
  "name": "some-funkey-name",
  "dockerComposeFile": "docker-compose.yml",
  "service": "development",
  "workspaceFolder": "/xyz",
  "postCreateCommand": "./.devcontainer/post-container-install.sh",
  "mounts": [
    "source=${localEnv:HOME}/.ssh,target=/root/.sshtemplate,type=bind,readonly,consistency=cached"
  ],

Change the target if you work on a different user.

2. Copy from .sshtemplate -> .ssh

copy-ssh-files.sh

#!/usr/bin/env bash
set -u

if [ -d /root/.sshtemplate ]; then
  cp -rf /root/.sshtemplate/. ~/.ssh/
  chmod 700 ~/.ssh
  chmod 600 ~/.ssh/* 2>/dev/null || true
fi

3. Remove lines with UseKeychain

remove-usekeychain-lines.sh

#!/usr/bin/env bash
set -u

# Remove UseKeychain (case-insensitive) from a config file if it exists
if [ -f "$1" ]; then
  sed -i '/UseKeychain/I d' "$1"
  echo "UseKeychain removed from $1."
fi

4. Create post install file

post-container-install.sh

#!/usr/bin/env bash
...
"$SCRIPTS_DIR/copy-ssh-files.sh"
"$SCRIPTS_DIR/remove-usekeychain-lines.sh" ~/.ssh/config

Enjoy!

Discussion in the ATmosphere

Loading comments...