簡體   English   中英

通過 ssh 連接時,docker-compose env vars 不可用

[英]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 與否:

此外,根據您的用例,您現在有各種選項可以將這些文件添加到容器中:

  • 如果變量是靜態的:只需ADD相應的文件,圖像,或在創建它Dockerfile
  • 如果變量是在構建時設置的:使用ARG (或ENV )將變量傳遞給構建並從構建中的文件創建相應的文件(就像您在解決方案中所做的那樣)
  • 如果變量應該在容器運行時設置:
    • 使用自定義ENTRYPOINT腳本從傳遞的環境變量或命令行參數在啟動時生成相應的文件
    • 將相應的文件卷安裝到容器中(您也可以在此處使用docker secret處理敏感數據)

環境變量存在於RUN命令和您在發出docker exec命令時執行的 shell 中,但是當您 ssh 進入在容器內運行的 ssh 服務器時,您實際上會得到一個全新的 shell,它沒有設置這些 env 變量。

暫無
暫無

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

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