【问题标题】:Why does container does't execute scripts inside /etc/my_init.d/ on startup?为什么容器在启动时不执行 /etc/my_init.d/ 中的脚本?
【发布时间】:2019-06-25 19:44:22
【问题描述】:

我有以下 Dockerfile:

FROM phusion/baseimage:0.9.16

RUN mv /build/conf/ssh-setup.sh /etc/my_init.d/ssh-setup.sh

EXPOSE 80 22

CMD ["node", "server.js"]

我的/build/conf/ssh-setup.sh 如下所示:

#!/bin/sh

set -e

echo "${SSH_PUBKEY}" >> /var/www/.ssh/authorized_keys

chown www-data:www-data -R /var/www/.ssh
chmod go-rwx -R /var/www/.ssh

它只是将SSH_PUBKEY env 添加到/var/www/.ssh/authorized_keys 以启用ssh 访问。

我像下面这样运行我的容器:

docker run -d -p 192.168.99.100:80:80 -p 192.168.99.100:2222:22 \
   -e SSH_PUBKEY="$(cat ~/.ssh/id_rsa.pub)" \ 
   --name dev hub.core.test/dev

我的容器启动正常,但不幸的是 /etc/my_init.d/ssh-setup.sh 脚​​本没有被执行,我无法 ssh 我的容器。

您能帮我看看/var/www/.ssh/authorized_keys 在我的容器启动时没有被执行的原因吗?

【问题讨论】:

    标签: docker ssh dockerfile


    【解决方案1】:

    我有一个非常相似的问题,也使用 phusion/baseimage。原来我的启动脚本需要是可执行的,例如

    RUN chmod +x /etc/my_init.d/ssh-setup.sh
    

    注意:

    我注意到您没有使用 baseimage 的初始化系统(可能是故意的?)。但是,根据我对他们manifesto 的理解,这样做会放弃他们的整个“更好的初始化系统”方法。

    我的理解是,在您的情况下,他们希望您将 node server.js 的启动命令移动到 my_init.d 内的脚本中,例如/etc/my_init.d/start.sh 并在您的 dockerfile 中使用他们的 init 系统作为启动命令,例如

    FROM phusion/baseimage:0.9.16
    
    RUN mv /build/conf/start.sh /etc/my_init.d/start.sh
    RUN mv /build/conf/ssh-setup.sh /etc/my_init.d/ssh-setup.sh
    
    RUN chmod +x /etc/my_init.d/start.sh
    RUN chmod +x /etc/my_init.d/ssh-setup.sh
    
    EXPOSE 80 22
    
    # Use baseimage-docker's init system.
    CMD ["/sbin/my_init"]
    

    这将启动 baseimage 的 init 系统,然后它会查看您的 /etc/my_init.d/ 并按字母顺序执行其中的所有脚本。当然,它们都应该是可执行的。

    我的参考资料是:Running start scriptsGetting Started

    【讨论】:

      【解决方案2】:

      如上一个答案所述,您没有执行 ssh-setup.sh。在 Docker 容器中只能有一个进程(这是一个谎言,但现在可以了)。为什么不将 ssh-setup.sh 作为您的 CMD/ENTRYPOINT 进程运行并将 ssh-setup.sh exec 执行到您的最终命令中,即

      exec node server.js
      

      或者更干净,有一个脚本,比如 boot.sh,它运行任何初始化脚本,比如 ssh-setup.sh,然后执行到节点。

      【讨论】:

        【解决方案3】:

        因为您在启动容器时没有调用/etc/my_init.d/ssh-setup.sh。 您应该在 CMD 或 ENTRYPOINT 中调用它,在此处阅读更多内容

        RUN 在新层中执行命令并创建新图像。例如。, 它通常用于安装软件包。
        CMD 设置默认值 命令和/或参数,可以从命令行覆盖 当 docker 容器运行时。
        ENTRYPOINT 配置一个容器 将作为可执行文件运行。

        【讨论】:

        • 感谢您的回复,但我已经拥有执行 node.js 服务器的 CMD。我可以和他一起调用我的 ssh-setup.sh 脚本吗?
        • 尝试用 CMD CMD node server.js ; /etc/my_init.d/ssh-setup.sh重建你的镜像
        • 你的意思是CMD ["/etc/my_init.d/ssh-setup.sh", "node", "server.js"] 吗?
        • CMD 有两种形式:shell 形式和 exec 形式。我的 CMD 是 shell 形式,我不知道如何从 shell 形式迁移到 exec 形式,你可以尝试我的 CMD 来重建你的图像。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2021-10-30
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多