在docker构建时启用ssh

在docker构建时启用ssh,docker,ansible,Docker,Ansible,Docker版本17.11.0-ce,内部版本1caf76c 在docker构建期间,我需要运行Ansible来构建和部署一些java项目,以便在运行docker image时对所有内容进行设置。但是,Ansible需要ssh到本地主机。到目前为止,我还不能让它工作。我尝试过不同的docker图像,现在我最终选择了phusion。我有什么自动取款机: FROM phusion/baseimage # Use baseimage-docker's init system. CMD ["/sbin

Docker版本17.11.0-ce,内部版本1caf76c

在docker构建期间,我需要运行Ansible来构建和部署一些java项目,以便在运行docker image时对所有内容进行设置。但是,Ansible需要ssh到本地主机。到目前为止,我还不能让它工作。我尝试过不同的docker图像,现在我最终选择了phusion。我有什么自动取款机:

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从运行后台命令返回,它将退出而不再输入,用于该运行命令的容器将终止。从运行中保存的唯一内容是对文件系统的更改。不保存正在运行的进程、环境变量或shell状态

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

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

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

该Dockerfile中存在多个问题

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

另一个问题是127.0.0.1不在已知的_主机中

最后,您必须给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映像。签出

为什么不在主机中执行所有ssh步骤,并将~/.ssh/目录作为卷共享?@mulg0r在生成期间不能共享卷。您应该给ansible容器一个机会。它是一个用Ansible而不是Dockerfile创建docker图像的工具:为什么不在容器启动时这样做呢?为什么必须在构建时进行?