在docker构建时启用ssh

时间:2018-05-24 10:34:49

标签: docker ansible

Docker版本17.11.0-ce,build 1caf76c

我需要运行Ansible来构建&在docker构建时间期间部署到wildfly一些java项目,这样当我运行docker image时,我已经完成了所有设置。但是,Ansible需要ssh到localhost。到目前为止,我无法使其正常工作。我尝试了不同的码头图像,现在我最终得到了错误(https://github.com/phusion/baseimage-docker#login_ssh)。我有什么atm:

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

有什么建议可能有什么不对吗?是否有可能实现这一目标?

2 个答案:

答案 0 :(得分:0)

RUN /usr/sbin/sshd -d &

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

这样的事情可能有用,但你可能还需要一个睡眠命令来给sshd时间来完成启动。

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

我个人在构建过程中没有使用sshd来寻找另一种方法。这感觉非常麻烦且容易出错。

答案 1 :(得分:0)

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.1\n\tStrictHostKeyChecking no\n" >> ~/.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