本实例基于 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)
可以实现同样的效果,如下图: