2017-11-25 230 views
1

我试图用-v国旗,但容器的状态变为Exited (0) 1映射本地目录容器/home/ubuntu/data/var/lib/mysql文件夹。但是,如果我根本不使用-v标志,则容器是Up,但这不是我想要的。可能是什么原因?我看到volume mount行在与工作示例相反的事件日志中缺失。与-v标志泊坞窗运行命令使容器在已退出状态

$ docker -v 
Docker version 17.09.0-ce, build afdb6d4 

Dockerfile

FROM ubuntu:16.04 

RUN apt-get update \ 
&& DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server \ 
&& sed -i "s/127.0.0.1/0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf \ 
&& mkdir /var/run/mysqld \ 
&& chown -R mysql:mysql /var/run/mysqld 

VOLUME ["/var/lib/mysql"] 

EXPOSE 3306 

CMD ["mysqld_safe"] 

这是不工作。

$ docker run -i -t -d -v /home/ubuntu/data:/var/lib/mysql --name mysql_container mysql_image 

事件日志。

2017-11-... container create 08b44c094... (image=mysql_image, name=mysql_container) 

2017-11-... network connect 62bb211934... (container=08b44c094..., name=bridge, type=bridge) 

2017-11-... container start 08b44c094... (image=mysql_image, name=mysql_container) 

2017-11-... container die 08b44c094... (exitCode=0, image=mysql_image, name=mysql_container) 

2017-11-... network disconnect 62bb211934... (container=08b44c094..., name=bridge, type=bridge) 

集装箱日志。

$ docker logs -t mysql_container 
2017-11-... mysqld_safe Logging to syslog. 
2017-11-... mysqld_safe Logging to '/var/log/mysql/error.log'. 
2017-11-... mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 

此作品,未经-v

$ docker run -i -t -d --name mysql_container mysql_image 

事件日志。

2017-11-... container create 84993141... (image=mysql_image, name=mysql_container) 

2017-11-... network connect 62bb2119... (container=84993141..., name=bridge, type=bridge) 

2017-11-... volume mount 8c36b53d33... (container=84993141...7, destination=/var/lib/mysql, driver=local, propagation=, read/write=true) 

2017-11-... container start 84993141... (image=mysql_image, name=mysql_container) 

集装箱日志。

$ docker logs -t mysql_container 
2017-11-... mysqld_safe Logging to syslog. 
2017-11-... mysqld_safe Logging to '/var/log/mysql/error.log'. 
2017-11-... mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql 
2017-11-... mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 
+0

为什么不使用mysql容器? https://hub.docker.com/_/mysql/ – JazZ

+0

因为我正在尝试学习的东西,因为我在这个阶段是新手。 – BentCoder

回答

1

这是一个有点复杂但有趣的案例。

那么如何检查发生了什么?使用下面的命令:

docker run -i -t -v /tmp/data:/var/lib/mysql mysql_image bash 

现在你在里面容器所以让我们尝试命令:

mysqld_safe 

而且它的结束,但让我们看看/var/log/mysql/error.log 我们看到有:

2017-11-25T17:22:24.006180Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation. 
2017-11-25T17:22:24.006211Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory. 
2017-11-25T17:22:24.006221Z 0 [ERROR] InnoDB: Operating system error number 13 in a file operation. 
2017-11-25T17:22:24.006229Z 0 [ERROR] InnoDB: The error means mysqld does not have the access rights to the directory. 
2017-11-25T17:22:24.006237Z 0 [ERROR] InnoDB: Cannot open datafile './ibdata1' 

好的,我们的请参阅/var/lib/mysql外观如何不使用体积映射:

[email protected]:/var/lib/mysql# ls -lah 
total 109M 
drwx------ 5 mysql mysql 4.0K Nov 25 17:24 . 
drwxr-xr-x 1 root root 4.0K Nov 25 17:13 .. 
-rw-r----- 1 mysql mysql 56 Nov 25 17:13 auto.cnf 
-rw-r--r-- 1 root root  0 Nov 25 17:13 debian-5.7.flag 
-rw-r----- 1 mysql mysql 419 Nov 25 17:13 ib_buffer_pool 
-rw-r----- 1 mysql mysql 48M Nov 25 17:13 ib_logfile0 
-rw-r----- 1 mysql mysql 48M Nov 25 17:13 ib_logfile1 
-rw-r----- 1 mysql mysql 12M Nov 25 17:13 ibdata1 
drwxr-x--- 2 mysql mysql 4.0K Nov 25 17:13 mysql 
drwxr-x--- 2 mysql mysql 4.0K Nov 25 17:13 performance_schema 
drwxr-x--- 2 mysql mysql 12K Nov 25 17:13 sys 
  1. 的mysql:mysql的是,目录
  2. 我们有

很多MySQL的具体文件,让我们看看我们有什么用卷映射的所有者:

[email protected]:/var/lib/mysql# ls -lah 
total 8.0K 
drwxr-xr-x 2 root root 4.0K Nov 25 17:22 . 
drwxr-xr-x 1 root root 4.0K Nov 25 17:13 .. 
  1. Docker以root用户映射这个目录Docker正在映射这个d irectory到主机,所以所有的文件消失,因为在主机上,该目录是空的

如何获得此工作? 更改您的命令:

CMD chown -R mysql:mysql /var/lib/mysql && if [ ! -c /var/lib/mysql/ibdata1 ]; then mysqld --initialize-insecure; fi && mysqld_safe 

这是怎么回事呢?

chown -R mysql:mysql /var/lib/mysql - get back mysql:mysql owner 
if [ ! -c /var/lib/mysql/ibdata1 ]; then mysqld --initialize-insecure; fi - recreate mysql files with root user without pass but only if files not already exists (required for next runs) 
mysqld_safe - run mysql 
+0

这是你的意思吗? 'CMD [“chown -R mysql:mysql/var/lib/mysql && mysqld --initialize-insecure && mysqld_safe”] – BentCoder

+0

我遵循你的调试步骤,一切正常。但是,如果将'CMD [“mysqld_safe”]'改为'CMD [“chown -R mysql:mysql/var/lib/mysql && mysqld --initialize-insecure && mysqld_safe]''',我会得到'--initialize指定的但是数据目录中有文件。除非我误解了你,否则在运行docker run时中止'错误。 – BentCoder

+0

不,不,我给你适当的CMD指令(没有[]数组和不带“”),看到这里:https://docs.docker.com/engine/reference/builder/#cmd “与shell形式不同, exec表单不会调用命令shell,这意味着正常的shell处理不会发生。“ 我们需要shell来获取工作:) –