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
有什么建议可能有什么不对吗?是否有可能实现这一目标?
答案 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