[英]docker-compose env vars not available when connecting via ssh
我有一個本地開發環境,它需要通過 SSH 訪問不同的主機,所以我設置了一個 docker-compose.yml 和一些服務:
services:
ssh1:
build:
context: ./.project/docker/ssh1
dockerfile: Dockerfile
environment:
MYSQL_USER: app1
MYSQL_PASSWORD: app1
Dockerfile 包含以下內容:
FROM ubuntu:20.04
RUN export DEBIAN_FRONTEND=noninteractive \
&& ln -fs /usr/share/zoneinfo/Europe/Berlin /etc/localtime \
&& apt update \
&& apt upgrade -y \
&& apt install -y openssh-server rsync php \
&& mkdir /run/sshd/ \
&& ssh-keygen -A \
&& for key in $(ls /etc/ssh/ssh_host_* | grep -v pub); do echo "HostKey $key" >> /etc/ssh/sshd_config; done \
&& addgroup --gid 1000 app \
&& adduser --gecos "" --disabled-password --shell /bin/bash --uid 1000 --gid 1000 app \
&& mkdir -m 700 /home/app/.ssh/ \
&& chown app:app /home/app/.ssh/ \
&& rm -rf /var/lib/apt/lists/*
COPY --chown=app:app ssh1_rsa.pub /home/app/.ssh/authorized_keys
CMD ["/usr/sbin/sshd", "-D"]
EXPOSE 22
我可以驗證,在容器中設置了環境變量
$ docker-compose exec ssh1 printenv | grep MYSQL
MYSQL_USER=app1
MYSQL_PASSWORD=app1
docker inspect project_ssh1_1
還顯示了 ENV 變量。
但是當我通過 ssh 從另一個容器連接到ssh1
,我的環境變量沒有設置。
為什么當我 ssh 進入容器時我的環境變量沒有設置?
我也很欣賞任何關於如何通過 docker 在容器中設置 env vars 以及如何從進程或“OS”繼承 env vars 的深入輸入。
實際問題得到了回答。 但是,我沒有問正確的問題。 所以這是我的實際解決方案。 我能夠在一個非常hacky的解決方案的幫助下在SSH會話中設置ENV VARS,它不應該在PROD環境中使用,因為它可能導致信息泄露。
添加所有 ENV VARS 作為構建參數。 docker-compose.yml:
ssh1:
build:
context: ./.project/docker/ssh1
dockerfile: Dockerfile
args:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app1
MYSQL_USER: app1
MYSQL_PASSWORD: app1
MYSQL_HOST: mysql1
並將它們寫入 $HOME/.ssh/environment 並啟用 PermitUserEnvironment。 不要在生產中這樣做
文件
FROM ubuntu:20.04
ARG MYSQL_ROOT_PASSWORD
ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_HOST
RUN echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" >> /home/app/.ssh/environment \
&& echo "MYSQL_DATABASE=$MYSQL_DATABASE" >> /home/app/.ssh/environment \
&& echo "MYSQL_USER=$MYSQL_USER" >> /home/app/.ssh/environment \
&& echo "MYSQL_PASSWORD=$MYSQL_PASSWORD" >> /home/app/.ssh/environment \
&& echo "MYSQL_HOST=$MYSQL_HOST" >> /home/app/.ssh/environment \
&& sed -i 's/#PermitUserEnvironment no/PermitUserEnvironment yes/g' /etc/ssh/sshd_config
現在,當您登錄時,SSH 將從用戶 .ssh/environment(在本例中為app
)讀取環境變量並將它們設置在用戶的 SSH 會話中。
您的問題實際上與docker
沒有太大關系,而是由於sshd
工作方式造成的:對於每個連接, sshd
都會設置一個新環境,清除其自身環境中的所有變量,請參閱man sshd
的登錄過程。
(很容易理解為什么這是有道理的: sshd
是由 root 用戶啟動的,因此其環境變量中可能包含不應泄露給用戶的敏感數據。其他變量傳遞給用戶會話是不合理的,例如HOME
, PATH
, SHELL
)
根據您的用例,有多種方法可以將環境變量傳遞給新的ssh
會話,具體取決於它是交互式會話還是非交互式會話,運行(登錄)shell 與否:
~/.ssh/environment
: ssh
注入的變量,見PermitUserEnvironment
/etc/environment
: pam_env
在登錄時使用/etc/profile
、 ~/.bashrc
等:(登錄)shell 使用的配置,例如參見bash
。此外,根據您的用例,您現在有各種選項可以將這些文件添加到容器中:
ADD
相應的文件,圖像,或在創建它Dockerfile
ARG
(或ENV
)將變量傳遞給構建並從構建中的文件創建相應的文件(就像您在解決方案中所做的那樣)ENTRYPOINT
腳本從傳遞的環境變量或命令行參數在啟動時生成相應的文件docker secret
處理敏感數據)環境變量存在於RUN
命令和您在發出docker exec
命令時執行的 shell 中,但是當您 ssh 進入在容器內運行的 ssh 服務器時,您實際上會得到一個全新的 shell,它沒有設置這些 env 變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.