无法在使用dockerFile构建映像的容器内运行mysql

时间:2018-08-16 07:54:53

标签: docker

我试图用dockerFile建立一个mysql镜像。 以下是我的代码:

FROM ubuntu
MAINTAINER jimmy

#install mysql
RUN apt-get update
RUN apt-get install -y mysql-server
RUN apt-get install -y mysql-client
RUN apt-get install -y libmysqlclient-dev

#set permission of mysql
RUN service mysql stop
RUN usermod -d /var/lib/mysql/ mysql
RUN chown -R mysql:mysql /var/lib/mysql 

当我运行 docker build -t mysql-test时。 --no-cache ,它将成功构建映像。

但是如果我在其中建立一个容器,然后运行 service mysql start ,它将失败。

* Starting MySQL database server mysqld                     [fail] 

我必须在容器内再次键入 chown -R mysql:mysql / var / lib / mysql ,这样才能成功运行 service mysql start 。< / p>

那是为什么?我已经在dockerFile中 RUN chown -R mysql:mysql / var / lib / mysql 了吗?

1 个答案:

答案 0 :(得分:0)

尝试将/var/lib/mysql目录定义为Dockerfile中的卷-

FROM ubuntu
MAINTAINER jimmy

#install mysql
RUN apt-get update -y
RUN apt-get install -y mysql-server
RUN apt-get install -y mysql-client
RUN apt-get install -y libmysqlclient-dev

RUN echo yes
VOLUME /var/lib/mysql        #change

RUN mkdir -p /var/run/mysqld   #change
RUN usermod -d /var/lib/mysql/ mysql
RUN find /var/lib/mysql -type f -exec touch {} \;        #change
RUN chown -R mysql:mysql /var/lib/mysql /var/run/mysqld  #change

这个Dockerfile为我解决了这个问题。 Docker建议您在Docker中使用mysql服务时使用卷。

似乎仍然是一个未解决的问题-https://github.com/docker/for-linux/issues/72

Ref-https://github.com/moby/moby/issues/35503

详细说明-

  

是的,众所周知,overlayfs仅支持POSIX的一个子集   标准(另请参阅docker / for-linux#72(评论),感谢Akihiro)

     

通常,状态数据不应存储在容器的   文件系统,但在一个卷中。不仅可以升级   容器而不会丢失您的数据(当   将这些容器作为服务的一部分运行,因为更新了   服务将用新容器替换容器),它也有一个很大的容器   影响性能,因为在容器的文件系统中进行写入   添加用于以下用途的写时复制文件系统的开销   容器。

     

有关更多信息,请参见文档中的“卷”部分。   https://docs.docker.com/engine/admin/volumes/,以及“存储位置   Docker Hub上官方MySQL映像的“数据”部分   https://hub.docker.com/_/mysql/

     

如果您的目标是运行MySQL容器,我绝对会建议   查看官方的MySQL映像,其中设置了mysql   在容器中运行,还可以初始化新容器   使用/docker-entrypoint-initdb.d备份的实例(请参阅   Docker上MySQL自述文件中的“初始化新实例”部分   集线器)