【问题标题】:Docker : Start mysql and apache from entrypoint or CMDDocker:从入口点或 CMD 启动 mysql 和 apache
【发布时间】:2017-09-14 23:37:01
【问题描述】:

构建一个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: 没有这样的文件或目录"

这是我目前所拥有的:

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

【问题讨论】:

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

标签: mysql apache docker cmd entry-point


【解决方案1】:

一种常见的模式是在 Docker 映像中包含一个脚本(bash、shell 等),然后将该脚本用作应用程序的入口点。请参阅https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#entrypoint中描述的内容

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

【讨论】:

  • 你会在脚本中放什么,你会如何从 dockerfile 中调用它?
  • 这就是我最终要做的。
【解决方案2】:

在我看来,您启动 Apache 或 Mysql 的方式是错误的

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

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

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

CMD ["mysqld"]

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

【讨论】:

  • s6-overlay 项目使 s6 容器设置更容易
  • 你做的很好
  • apache 命令有效,而不是 mysql 命令。另外,我正在尝试同时启动这两个,以获取一个正常工作的 LAMP 服务器
  • 我的目标是一个简单的设置,所以我现在不使用主管。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多