簡體   English   中英

將 SSH 密鑰注入 Docker 容器

[英]Inject SSH key into a Docker container

我正在嘗試找到一種“全局”解決方案,用於將 SSH 密鑰注入到容器中。 我知道有幾種解決方案,包括 docker build kit 等等……但我不想構建映像並注入 SSH 密鑰。 我想通過使用帶有 docker compose 的現有圖像來注入 SSH 密鑰。

我使用以下 docker compose 文件:

version: '3.1'

services:
  server1:
    image: XXXXXXX
    container_name: server1
    command: bash -c "/root/init.sh && python3 /root/my_python.py"
    environment:
      - MANAGED_HOST=mserver
    volumes:
      - ./init.sh:/root/init.sh
    secrets:
      - id_rsa

secrets:
   id_rsa:
     file: /home/user/.ssh/id_rsa

init.sh 如下:

#!/bin/bash

eval "$(ssh-agent -s)" > /dev/null
if [ ! -d "/root/.ssh/" ]; then
    mkdir /root/.ssh
    ssh-keyscan $MANAGED_HOST > /root/.ssh/known_hosts
fi
ssh-add -k /run/secrets/id_rsa

如果我使用參數命令bash -c "/root/init.sh && python3 /root/my_python.py"運行bash -c "/root/init.sh && python3 /root/my_python.py" ,則對相應遠程主機 ($MANAGED_HOST) 的 SSH 身份驗證不起作用。

一個代理進程正在運行:

root         8     1  0 12:50 ?        00:00:00 ssh-agent -s

known_hosts 沒問題:

root@c67655d87ced:~# cat /root/.ssh/known_hosts
BLABLABLA ssh-rsa AAAAB3BLABLABLA....

並且代理正在運行,但未添加私鑰:

root@c67655d87ced:~# ssh-add -l
Could not open a connection to your authentication agent.

現在,如果我登錄容器 (docker exec -it server1 /bin/bash) 並從命令行一一運行 init.sh 中的命令,則對相應遠程主機 ($MANAGED_HOST) 的 SSH 身份驗證正在工作?!?

任何想法,我如何使用 docker compose 讓它工作?

足以使文件$HOME/.ssh/id_rsa以適當的權限存在; 您不需要運行 ssh 代理。

#!/bin/sh
if ! [ -d "$HOME/.ssh" ]; then
  mkdir "$HOME/.ssh"
fi
chmod 0700 "$HOME/.ssh"
if [ -n "$MANAGED_HOST" ]; then
  ssh-keyscan "$MANAGED_HOST" >> "$HOME/.ssh/known_hosts"
fi
if [ -f /run/secrets/id_rsa ]; then
  cp /run/secrets/id_rsa "$HOME/.ssh/id_rsa"
  chmod 0400 "$HOME/.ssh/id_rsa"
fi
# exec "$@"

一個典型的模式是使用 Dockerfile ENTRYPOINT來執行這樣的首次設置任務。 這將作為參數傳遞CMD ,文件末尾的注釋exec "$@"行將其作為命令運行。 您可以在圖像的 Dockerfile 中進行設置,例如:

FROM XXXXXX
...
# Script must be executable on the host, and must start with a
# #!/bin/sh "shebang" line
COPY init.sh /root
# MUST use JSON-array form
ENTRYPOINT ["/root/init.sh"]
# Can use any Dockerfile syntax
CMD ["python3", "/root/my_python.py"]

在您的特定示例中,您將init.sh作為子init.sh啟動。 ssh-agent設置設置了一些環境變量,例如$SSH_AUTH_SOCK ,但是當它們作為子進程運行時,它們不會傳播回主機進程。 您可以使用標准的 POSIX shell . 內置(bash source內置是等效的,但非標准)導致在父 shell 的上下文中設置這些環境變量:

command: sh -c ". /root/init.sh && exec python3 /root/my_python.py"

exec將 shell 包裝器替換為您通常需要的 Python 腳本。 這也將最終成為ssh-agent的父進程,如果它碰巧退出,這可能會讓您的進程感到驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM