我试图用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 了吗?
答案 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自述文件中的“初始化新实例”部分 集线器)