[英]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.