在 docker 构建时启用 ssh



Docker 版本 17.11.0-ce,build 1caf76c

我需要运行 Ansible 来构建和部署,以便在 docker 构建时创建一些 java 项目,这样当我运行 docker 镜像时,我已经设置了所有内容。但是,Ansible 需要 ssh 到本地主机。到目前为止,我无法使其工作。我尝试了不同的 docker 映像,现在我最终得到了 phusion (https://github.com/phusion/baseimage-docker#login_ssh(。我有什么自动取款机:

FROM phusion/baseimage
# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
RUN rm -f /etc/service/sshd/down
# Regenerate SSH host keys. baseimage-docker does not contain any, so you
# have to do that yourself. You may also comment out this instruction; the
# init system will auto-generate one during boot.
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
RUN cat ~/.ssh/id_rsa.pub | tee -a ~/.ssh/authorized_keys
RUN sed -i "s/#PermitRootLogin no/PermitRootLogin yes/" /etc/ssh/sshd_config && 
exec ssh-agent bash && 
ssh-add ~/.ssh/id_rsa
RUN /usr/sbin/sshd -d &
RUN ssh -tt root@127.0.0.1
CMD ["/bin/bash"]

但我仍然得到

Step 11/12 : RUN ssh -tt root@127.0.0.1
---> Running in cf83f9906e55
ssh: connect to host 127.0.0.1 port 22: Connection refused
The command '/bin/sh -c ssh -tt root@127.0.0.1' returned a non-zero code: 255

任何建议可能出了什么问题?甚至有可能做到这一点吗?

RUN /usr/sbin/sshd -d &

这将使用 shell 在后台运行一个进程。一旦启动进程的 shell 从运行后台命令返回,它就会退出,不再有输入,并且用于该 RUN 命令的容器将终止。从 RUN 中保存的唯一内容是对文件系统的更改。不保存正在运行的进程、环境变量或 shell 状态。

像这样的东西可能会起作用,但您可能还需要一个 sleep 命令来给 sshd 时间来完成启动。

RUN /usr/sbin/sshd -d & 
ssh -tt root@127.0.0.1 

我个人会寻找另一种在构建过程中不使用 sshd 的方法。这感觉非常笨拙且容易出错。

Dockerfile 中存在多个问题

首先,您不能在 RUN 语句中运行后台进程,并期望该进程在另一个 RUN 中运行。Dockerfile 的每个语句都在不同的容器中运行,因此进程不会在它们之间持久化。

另一个问题是 127.0.0.1 不在known_hosts中。

最后,你必须给 sshd 一些时间来开始。

这是一个有效的 Dockerfile:

FROM phusion/baseimage
CMD ["/sbin/my_init"]
RUN rm -f /etc/service/sshd/down
RUN /etc/my_init.d/00_regen_ssh_host_keys.sh
RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
RUN cat ~/.ssh/id_rsa.pub | tee -a ~/.ssh/authorized_keys
RUN printf "Host 127.0.0.1ntStrictHostKeyChecking non" >> ~/.ssh/config
RUN sed -i "s/#PermitRootLogin no/PermitRootLogin yes/" /etc/ssh/sshd_config && 
exec ssh-agent bash && 
ssh-add ~/.ssh/id_rsa
RUN /usr/sbin/sshd & sleep 5 && ssh -tt root@127.0.0.1 'ls -al'
CMD ["/bin/bash"]

无论如何,我宁愿找到另一种解决方案,而不是在 Dockerfile 中使用 Ansible 为您配置映像。查看 ansible-container

最新更新