与-v标志泊坞窗运行命令使容器在已退出状态
我试图用-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
这是一个有点复杂但有趣的案例。
那么如何检查发生了什么?使用下面的命令:
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
- 的mysql:mysql的是,目录
- 我们有
很多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 ..
- 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
这是你的意思吗? 'CMD [“chown -R mysql:mysql/var/lib/mysql && mysqld --initialize-insecure && mysqld_safe”] – BentCoder
我遵循你的调试步骤,一切正常。但是,如果将'CMD [“mysqld_safe”]'改为'CMD [“chown -R mysql:mysql/var/lib/mysql && mysqld --initialize-insecure && mysqld_safe]''',我会得到'--initialize指定的但是数据目录中有文件。除非我误解了你,否则在运行docker run时中止'错误。 – BentCoder
不,不,我给你适当的CMD指令(没有[]数组和不带“”),看到这里:https://docs.docker.com/engine/reference/builder/#cmd “与shell形式不同, exec表单不会调用命令shell,这意味着正常的shell处理不会发生。“ 我们需要shell来获取工作:) –
为什么不使用mysql容器? https://hub.docker.com/_/mysql/ – JazZ
因为我正在尝试学习的东西,因为我在这个阶段是新手。 – BentCoder