Docker:从入口点或CMD启动mysql和apache

问题描述:

为开发构建Docker镜像,我想在运行镜像时自动启动mysql和apache。Docker:从入口点或CMD启动mysql和apache

如果我登录容器并运行“service apache2 start”和“service mysql start”,它就可以工作。但是如果我放入入口点或CMD就会失败。 我能够通过将ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]启动Apache,但我无法以编程方式启动mysql。

我尝试了很多很多东西。大多数情况下,如果容器没有运行,默默无闻,其他时间我得到了:docker:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致“exec:\”/ etc/init .D /启动mysql \“:统计/etc/init.d/mysql启动:没有这样的文件或目录”

这是我到目前为止有:

FROM debian:wheezy 

RUN apt-get update && \ 
    apt-get install -y libmcrypt-dev \ 
    subversion ssl-cert nano wget unzip && \ 
    echo "deb http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list && \ 
    echo "deb-src http://packages.dotdeb.org wheezy-php56 all" >> /etc/apt/sources.list.d/dotdeb.list && \ 
    wget http://www.dotdeb.org/dotdeb.gpg -O- | apt-key add - && \ 
    echo mysql-server-5.5 mysql-server/root_password password yourpass | debconf-set-selections && \ 
    echo mysql-server-5.5 mysql-server/root_password_again password yourpass | debconf-set-selections && \ 
    apt-get update && \ 
    apt-get install -y \ 
    apache2 apache2-doc apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-php5 \ 
    openssl php-pear php5 php5-cli php5-common php5-curl php5-gd php5-mcrypt php5-mysql php5-memcache php5-readline \ 
    subversion ssl-cert nano wget unzip \ 
    mysql-server-5.5 mysql-client mysql-client-5.5 mysql-common && \ 
    /etc/init.d/mysql start && \ 
    mysql -u root -pyourpass -e "create database mydb;" && \ 
    rm -rf /var/lib/apt/lists/* && \ 
    rm /etc/apache2/sites-enabled/000-default && \ 
    mkdir -p /var/www/html && \ 
    chown www-data:www-data -R /var/www/html/ 

COPY conf/etc/ /etc/ 
COPY mydump.sql /var/www/html/mydump.sql 

RUN /etc/init.d/mysql start && \ 
    mysql -u root -pyourpass -h localhost mydb < /var/www/html/mydump.sql && \ 
    rm /var/www/html/mydump.sql 

VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2", "/var/lib/mysql"] 

EXPOSE 80 443 3306 
+0

失败,出现什么错误? –

+0

docker:来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致“exec:\”/ etc/init.d/mysql start \“:stat /etc/init.d/mysql start:没有这样的文件或目录“ –

经常看到的模型是在Docker镜像中包含脚本(bash,shell等),然后使用该脚本作为应用程序的入口点。见https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#entrypoint

描述所以,把你开始的东西放在一个docker-entrypoint.sh脚本中,复制脚本并从ENTRYPOINT引用它。

+1

你会在脚本中放什么,你会如何从dockerfile中调用它? –

+0

这就是我最终做的。 –

你启动Apache或Mysql的方式看起来我错了

如果我来看看最流行的Apache上hub.docker.com的Dockerfile演示如何启动Apache。该Dockerfile的最后一行是

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 

对于参考Mysql的,该Dockerfile的最后一行是

CMD ["mysqld"] 

所以,你可以看看supervisor或以任何其它类似的工具,像S6daemontools以Docker方式启动Apache和Mysql。

+0

[s6-overlay](https://github.com/just-containers/s6-overlay)项目使得s6容器设置更容易 – Matt

+0

你所做的很好 – user2915097

+0

apache命令可以工作,而不是mysql之一。此外,我试图启动两个,因为一个工作的LAMP服务器 –