我有一个Dockerfile来安装MySQL服务器在一个容器中,然后我这样开始:
sudo docker run -t -i 09d18b9a12be /bin/bash
Run Code Online (Sandbox Code Playgroud)
但MySQL服务不会自动启动,我必须手动运行(从容器内):
service mysql start
Run Code Online (Sandbox Code Playgroud)
运行docker容器时如何自动启动MySQL服务?
Lar*_*Cai 198
首先,你的问题是Dockerfile:
RUN service mysql restart && /tmp/setup.sh
Run Code Online (Sandbox Code Playgroud)
Docker镜像不保存正在运行的进程.因此,您的RUN命令仅在docker build阶段执行,并在构建完成后停止.相反,您需要在使用CMD或ENTRYPOINT如下命令启动容器时指定命令:
CMD mysql start
Run Code Online (Sandbox Code Playgroud)
其次,docker容器需要一个进程(last命令)来继续运行,否则容器将退出/停止.因此,正常service mysql start命令不能直接在Dockerfile中使用.
有三种典型的方法可以保持进程运行:
之后使用service命令并附加非结束命令tail -F
CMD service mysql start && tail -F /var/log/mysql/error.log
Run Code Online (Sandbox Code Playgroud)当您运行单个服务时,这通常是首选,因为它使得对接器可以访问输出的日志.
或使用foreground命令执行此操作
CMD /usr/bin/mysqld_safe
Run Code Online (Sandbox Code Playgroud)这只适用于有脚本的情况mysqld_safe.
或者将你的脚本包装进去start.sh并放入其中
CMD /start.sh
Run Code Online (Sandbox Code Playgroud)如果命令必须执行一系列步骤,那么这是最好的,同样/start.sh应该保持运行.
对于初学者使用supervisord不建议使用.老实说,这太过分了.对容器使用单个服务/单个命令要好得多.
顺便说一下:请查看https://registry.hub.docker.com了解现有的mysql docker图片以供参考
Jia*_*Jia 70
在你的Dockerfile,在最后一行添加
ENTRYPOINT service ssh restart && bash
Run Code Online (Sandbox Code Playgroud)
这个对我有用
这就是结果:
root@ubuntu:/home/vagrant/docker/add# docker run -i -t ubuntu
* Restarting OpenBSD Secure Shell server sshd [ OK ]
root@dccc354e422e:~# service ssh status
* sshd is running
Run Code Online (Sandbox Code Playgroud)
还有另一种方法,我总是发现它更具可读性.
假设您在运行时想要启动rabbitmq和mongodb,那么您CMD将看起来像这样:
CMD /etc/init.d/rabbitmq-server start && \
/etc/init.d/mongod start
Run Code Online (Sandbox Code Playgroud)
因为CMD每个Dockerfile技巧只能有一个是连接所有指令,&&然后\用于每个命令以开始一个新行.
如果您最终添加到其中的许多内容中,我建议您将所有命令放在脚本文件中,并像@ larry-cai建议的那样启动它:
CMD /start.sh
Run Code Online (Sandbox Code Playgroud)
这不起作用CMD service mysql start && /bin/bash
这不起作用CMD service mysql start ; /bin/bash ;
-- 我猜交互模式不支持前台。
这有效! CMD service nginx start ; while true ; do sleep 100; done;
这有效! CMD service nginx start && tail -F /var/log/nginx/access.log
请注意,您应该在没有命令参数的情况下使用docker run -p 80:80 nginx_bash。
小智 6
简单!在dockerfile的末尾添加:
ENTRYPOINT service mysql start && /bin/bash
Run Code Online (Sandbox Code Playgroud)
就我而言,我有一个 PHP Web 应用程序由 Apache2 在连接到 MYSQL 后端数据库的 docker 容器中提供服务。Larry Cai 的解决方案只需稍作修改即可工作。我创建了一个entrypoint.sh文件,在其中管理我的服务。我认为entrypoint.sh在容器启动时要执行多个命令时创建一个是引导 docker 的更简洁的方法。
#!/bin/sh
set -e
echo "Starting the mysql daemon"
service mysql start
echo "navigating to volume /var/www"
cd /var/www
echo "Creating soft link"
ln -s /opt/mysite mysite
a2enmod headers
service apache2 restart
a2ensite mysite.conf
a2dissite 000-default.conf
service apache2 reload
if [ -z "$1" ]
then
exec "/usr/sbin/apache2 -D -foreground"
else
exec "$1"
fi
Run Code Online (Sandbox Code Playgroud)
小智 5
我将以下代码添加到 /root/.bashrc 以仅运行该代码一次,
请在运行此脚本之前将容器提交到映像,否则将在映像中创建“docker_services”文件并且不会运行任何服务。
if [ ! -e /var/run/docker_services ]; then
echo "Starting services"
service mysql start
service ssh start
service nginx start
touch /var/run/docker_services
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
198173 次 |
| 最近记录: |