2017-11-25 224 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來獲取工作:) –