为什么要用 SSH 镜像?明明已经有 exec 可以进入容器了。我想每个看到这篇文章的人都有自己不得已的理由,而我的路由就是我们的开发在执行一后台任务时候,是利用 ssh 的方式连接到另外一台服务器才进行许多操作的,比如上传文件、查看日志、启动服务等等。
制作 SSH 引擎主要有一下几个问题:
- 在基础镜像包中安装 ssh 服务
- 让 ssh 服务在前台运行
- 可以自主定义 ssh 镜像的 root 用户名密码
因为涉及到要使用 ssh 镜像的场景,一般都涉及到较为复杂的老旧程序的容器化改造,所以这里选用的基础镜像是 centos7
下载 ssh 服务所需要的 RPM 包
docker run -it --rm -v /tmp:/tmp centos:7
yum install openssh-server passwd --downloadonly --downloaddir=/tmp
将下载好的 rpm 包复制到 dockerfile 的目录下面,这里是文件夹 sshd
Dockerfile
FROM centos:7
COPY sshd /yums/
ADD run.sh /app/
RUN yum install /yums/*.rpm -y
RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''&& \
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N '' && \
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N '' &&\
sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config && \
sed -i "s/UsePAM.*/UsePAM no/g" /etc/ssh/sshd_config &&\
chmod +x /app/run.sh &&\
echo '123456' | passwd root --stdin
# Set timezone
ENV TZ Asia/Shangha
WORKDIR /app
ENTRYPOINT [ "/app/run.sh" ]
启动脚本
#!/bin/bash
if [[ $ROOTPASSWORD ]]; then
echo $ROOTPASSWORD | passwd root --stdin
fi
/sbin/sshd -D
在K8S 内如果需要修改 root 密码,可以使用环境变来操作。
env:
- name: ROOTPASSWORD
value: "123456"
网友评论