我有一个奇怪的问题。
我无法 ssh 到具有 ip 地址的 docker 容器172.17.0.61
。
我收到以下错误:
$ ssh 172.17.0.61
ssh: connect to host 172.17.0.61 port 22: Connection refused
我的Dockerfile
确实包含openssh-server
安装步骤:
RUN apt-get -y install curl runit openssh-server
还有启动 ssh 的步骤:
RUN service ssh start
可能是什么问题?
当我使用进入容器时nsenter
并启动ssh
服务,然后我就可以 ssh 了。但是创建容器时ssh-server
似乎没有启动。
我应该怎么办?
答案1
容器与镜像
该RUN
语句用于在构建 docker 镜像时运行命令。
使用ENTRYPOINT
和 ,CMD
您可以定义使用该映像启动容器时要运行的内容。
看Dockerfile 参考了解如何使用它们的说明。
服务
容器中没有预装init-system,所以不能service ... start
在容器中使用。
考虑将语句中的进程CMD
作为前台进程启动,或者使用像 Phusion 或 Supervisord 这样的 init 系统。
答案2
我认为有一个更好的方法:
Dockerfile
FROM ubuntu:14.04.1
EXPOSE 22
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
RUN apt-get install -y openssh-server
ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
# THIS PART WILL BE REPLACED IF YOU PASS SOME OTHER COMMAND TO docker RUN
CMD while true; do echo "default arg" && sleep 1; done
docker-entrypoint.sh
#!/bin/bash
service ssh restart
exec "$@"
构建命令
docker build -t sshtest .
这种方法的好处是,当您使用 时,您的 ssh 守护进程将始终启动docker run
,但您也可以指定可选参数,例如:
docker run sshtest
default arg
每1秒打印一次是否每3秒docker run sshtest sh -c 'while true; do echo "passed arg" && sleep 3; done'
打印一次passed arg