【问题标题】:docker container can't use `service sshd restart`docker 容器不能使用`service sshd restart`
【发布时间】:2017-05-23 12:50:52
【问题描述】:

我正在尝试构建一个 hadoop Dockerfile

在构建过程中,我添加了:

  && apt install -y openssh-client \
  && apt install -y openssh-server \
  && ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa \
  && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \
  && chmod 0600 ~/.ssh/authorized_keys
  && sed -i '/\#AuthorizedKeysFile/ d' /etc/ssh/sshd_config \
  && echo "AuthorizedKeysFile ~/.ssh/authorized_keys" >> /etc/ssh/sshd_config \
  && /etc/init.d/ssh restart

我假设当我运行这个容器时:

docker run -it --rm hadoop/tag bash

我可以:

ssh localhost

但我得到了一个错误:

ssh:连接到主机 localhost 端口 22:连接被拒绝

如果我在容器内手动运行:

/etc/init.d/ssh restart
# or this
service ssh restart

然后我就可以连接了。我认为这意味着 sshd 重启不起作用

我在Dockerfile 中使用FROM java

【问题讨论】:

    标签: docker ssh dockerfile sshd


    【解决方案1】:

    构建过程只构建一个图像。当时运行的进程(使用RUN)在构建后不再运行,并且在使用映像启动容器时不会再次启动。

    您需要做的是让 sshd 在容器运行时启动。最简单的方法是使用入口点脚本。

    Dockerfile:

    COPY entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    
    ENTRYPOINT ["/entrypoint.sh"]
    CMD ["whatever", "your", "command", "is"]
    

    entrypoint.sh:

    #!/bin/sh
    
    # Start the ssh server
    /etc/init.d/ssh restart
    
    # Execute the CMD
    exec "$@"
    

    使用上面的方法重建镜像,当你用它来启动一个容器时,它应该在运行你的CMD之前启动sshd。

    如果您愿意,您还可以将开始时使用的基本映像更改为 Phusion baseimage 之类的内容。它可以轻松启动一些您可能希望容器运行的服务,例如 syslogd、sshd。

    【讨论】:

    • 谢谢,洛先生。这真的很有帮助。我看到了我的问题上下文的修改。再次感谢,我敢打赌你必须每天对你的女儿做很多这样的语法纠正?我不是以英语为母语的人,对此感到抱歉。
    • @cinqS 我确实清理了一些帖子 - 只是这里的标准程序......并不意味着任何冒犯,要清楚......我们有很多非母语英语演讲者,所以我们这些以母语为母语的人会尽最大努力帮助帖子尽可能地可读。
    猜你喜欢
    • 2013-07-09
    • 2014-04-26
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2020-07-28
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多