docker構建sshd


本實例基於docker構建jdk1.8進行構建,如不需要jdk,則將Dockerfile中第一行改爲 FROM centos 即可

Dockerfile

# 可以改爲 FROM centos
FROM centos-jdk 
MAINTAINER liuyang

# 安裝ssh服務
RUN yum install openssh-server -y 

#修改root用戶密碼爲root
#用以下命令修改密碼時,密碼中最好不要包含特殊字符,如"!",否則可能會失敗;
RUN /bin/echo "root" | passwd --stdin root

#生成密鑰
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key

#修改配置信息
RUN /bin/sed -i 's/.*session.*required.*pam_loginuid.so.*/session optional pam_loginuid.so/g' /etc/pam.d/sshd \
    && /bin/sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config \
    && /bin/sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config

EXPOSE 22

# 啓動sshd服務
CMD ["/usr/sbin/sshd","-D"]

編譯命令

docker build -t centos-jdk-sshd .

運行

docker run -dit --name sshd-centos -p 10022:22 centos-jdk-sshd
在這裏插入圖片描述

測試及遇到的問題

通過xshell連接10022端口
在這裏插入圖片描述
此時如果執行java -version會報command not found
在這裏插入圖片描述
但用exec進入容器內部發現沒問題,
在這裏插入圖片描述

問題分析及解決方案:

主要原因還是ssh爲用戶建立連接的時候會導致環境變量被重置。
這樣導致的最大問題就是通過ssh啓動的容器進程將無法獲取到容器啓動時候配置的環境變量。
瞭解了原理後,這個問題有個簡單的方法解決,就是可以通過將容器的環境變量重新設置到ssh連接後的session中。
具體的實現方式是,ssh連接後,會自動執行source /etc/profile。
那麼我們其實只要在/etc/profile追加幾行代碼,從1號進程獲取容器本身的環境變量,然後循環將環境變量export一下即可。
以下是一個簡單的for循環實現。

for item in `cat /proc/1/environ |tr '\0' '\n'`
do
 export $item
done

當然,有更簡潔的命令,就是

export $(cat /proc/1/environ |tr '\0' '\n' | xargs)

可以實現同樣的效果,如下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章