首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有-v标志的Docker命令将容器置于退出状态

带有-v标志的Docker命令将容器置于退出状态
EN

Stack Overflow用户
提问于 2017-11-25 15:33:11
回答 1查看 162关注 0票数 1

我试图使用/home/ubuntu/data标志将本地目录-v映射到容器中的/var/lib/mysql文件夹,但是容器的状态变成了Exited (0) 1。但是,如果我根本不使用-v标志,容器就是Up,但这不是我想要的。可能是什么原因?我看到与工作示例相反的事件日志中缺少volume mount行。

代码语言:javascript
复制
$ docker -v
Docker version 17.09.0-ce, build afdb6d4

Dockerfile

代码语言:javascript
复制
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"]

,这是不起作用的.

代码语言:javascript
复制
$ docker run -i -t -d -v /home/ubuntu/data:/var/lib/mysql --name mysql_container mysql_image

事件日志。

代码语言:javascript
复制
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)

集装箱日志。

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
$ docker run -i -t -d --name mysql_container mysql_image

事件日志。

代码语言:javascript
复制
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)

集装箱日志。

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-25 17:43:50

这案子有点复杂但很有趣。

你怎么才能查到发生了什么?使用以下命令:

代码语言:javascript
复制
docker run -i -t  -v /tmp/data:/var/lib/mysql  mysql_image bash

现在您在容器中,所以让我们尝试命令:

代码语言:javascript
复制
mysqld_safe

它已经结束了,但是让我们看看/var/log/mysql/error.log --我们看到了:

代码语言:javascript
复制
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是什么样子的:

代码语言:javascript
复制
root@4474b1cd4300:/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特定的文件

让我们看看卷映射得到了什么:

代码语言:javascript
复制
root@fca45ee1e8fb:/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用户。
  2. Docker正在将该目录映射到主机,因此所有文件都会消失,因为在主机上该目录是空的。

怎么才能得到这份工作?将命令更改为:

代码语言:javascript
复制
CMD chown -R mysql:mysql /var/lib/mysql && if [ ! -c /var/lib/mysql/ibdata1 ]; then mysqld --initialize-insecure; fi && mysqld_safe

那里发生了什么事?

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47487618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档