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

时间:2017-04-18 23:33:24

标签: mysql apache docker cmd entry-point

构建用于开发的docker镜像,我想在运行图像时自动启动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 start \“:stat /etc/init.d/mysql start:no such file or directory”

这是我到目前为止所做的:

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

2 个答案:

答案 0 :(得分:1)

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

中所述的内容

所以,将您开始的东西放在docker-entrypoint.sh脚本中,将脚本复制到其中,然后从ENTRYPOINT中引用它。

答案 1 :(得分:1)

你启动Apache或Mysql的方式对我来说是错误的

如果我查看hub.docker.com上最受欢迎的Apache,Dockerfile会显示如何启动Apache。 Dockerfile的最后一行是

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

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

CMD ["mysqld"]

因此,您可以查看supervisor或任何其他类似工具,例如S6daemontools,以便以Docker方式启动Apache和Mysql。

相关问题