本實例基於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)
可以實現同樣的效果,如下圖: