MariaDB永远不会在Docker镜像中启动

我正在创build一个托pipe图像与Ubuntu的可靠性和MariaDB 5.5,但我永远不能让MariaDB启动,除非我真的连接到正在运行的虚拟机。

Dockerfile:

FROM ubuntu:trusty # Upgrade packages RUN apt-get update && apt-get upgrade -y # So we can add a repo to apt RUN apt-get install -y software-properties-common # Add MariaDB repo to aptitude RUN apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db RUN add-apt-repository 'deb http://mirror.jmu.edu/pub/mariadb/repo/5.5/ubuntu trusty main' RUN apt-get update # Install MariaDB RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password password PASS' RUN DEBIAN_FRONTEND=noninteractive debconf-set-selections << 'mariadb-server-5.5 mysql-server/root_password_again password PASS' RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mariadb-server # Start MariaDB RUN service mysql start # Configure MariaDB User permissions RUN echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root 

我正在运行的命令创build:

 docker build -t ebth-com-trusty --file `pwd`/Dockerfile `pwd` --no-cache 

创build命令总是会失败,因为:

 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111) 

但是,如果我注释掉CREATE USER命令,然后连接到VM,我可以在运行手动service mysql start后连接到MariaDB。

这就好像RUN service mysql start不起作用,我不知道如何进一步debugging。

Dockerfile中的每个命令都在它自己的容器中运行。

你可以想像这个过程:

  1. 新的容器是使用以前的图像旋转起来的
  2. 该命令被执行
  3. 容器被旋转了
  4. 该容器的图像被用于下一个运行的命令

这意味着命令RUN service mysql start将启动一个新的容器,启动MariaDB,然后closures容器,包括closuresMariaDB。

请尝试使用CMD和ENTRYPOINT。 你可以把它们想象成设置默认的可执行文件,命令和参数,一旦容器被启动。 不过,两者之间的差别还是有点偏激。 查看文档: CMD和进入点

它看起来像这样:

 # Create default user RUN service mysql start && \ echo "CREATE USER 'ubuntu'@'localhost'" | mysql -u root # Start MariaDB ENTRYPOINT ["/bin/bash"] CMD ["service", "mysql", "start"]