我有以下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
在我的容器启动时没有被执行的原因是什么?
答案 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 scripts和Getting 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配置一个容器 将作为可执行文件运行。