为什么容器在启动时不会在/etc/my_init.d/中执行脚本?

时间:2016-11-13 13:53:40

标签: docker ssh dockerfile

我有以下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在我的容器启动时没有被执行的原因是什么?

3 个答案:

答案 0 :(得分:1)

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

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

注意:

我注意到你没有使用baseimage的init系统(也许是故意的?)。但是,根据我对他们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

答案 1 :(得分:0)

如上一个回答所述,您未执行ssh-setup.sh。您只能在Docker容器中拥有一个进程(这是一个谎言,但它现在会这样做)。为什么不将ssh-setup.sh作为CMD / ENTRYPOINT进程运行,并将ssh-setup.sh exec放入最终命令,即

exec node server.js

或者更清洁,有一个脚本,比如boot.sh,它运行任何init脚本,比如ssh-setup.sh,然后执行到节点。

答案 2 :(得分:-1)

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

  

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