首页 > 解决方案 > 在 docker 构建时启用 ssh

问题描述

Docker 版本 17.11.0-ce,构建 1caf76c

我需要在 docker build 期间运行 Ansible 来构建和部署一些 java 项目,这样当我运行 docker image 时,我就完成了所有设置。但是,Ansible 需要 ssh 到 localhost。到目前为止,我无法使其工作。我尝试了不同的 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

有什么建议可能是错的吗?甚至有可能实现这一目标吗?

标签: dockeransible

解决方案


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 的方法。这感觉非常笨拙且容易出错。


推荐阅读