【问题标题】:Docker container stops running only when volume is attachedDocker 容器仅在附加卷时停止运行
【发布时间】:2017-06-26 18:47:36
【问题描述】:

我写了一个在 ubuntu 镜像上运行 mysql 的 dockerfile。 Dockerfile 是:

FROM ubuntu
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server
RUN sed -i '43s/.*/bind-address            = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
EXPOSE 3306
ENTRYPOINT service mysql start && bash

如果我跑:

docker run -dit mysql-server

构建容器后一切正常,我的 Apache/PHP 容器可以与之通信。但是,如果我在附加卷 (docker run -dit -v ~/vol/:/var/lib/mysql/ mysql-server) 的情况下运行它,容器将在 30 秒后停止运行(我很确定每次运行的时间都相同)。

有谁知道我可以保持容器启动并安装卷的方法吗?我以前从未遇到过这个问题,并且在网上找不到其他任何东西(我一直在寻找一段时间)。谢谢。

【问题讨论】:

  • 来自docker logs的任何东西?
  • ~/vol 与该位置图像中存在的内容有何不同?不要忘记检查文件权限和文件的 uid/gid 所有权。
  • 你能尝试用&& sleep infinity替换ENTRYPOINT && bash吗?
  • 从 docker 日志中获取的信息不多,只是:* 启动 MySQL 数据库服务器 mysqld 没有目录,使用 HOME=/ [失败] 登录(如果不存在卷,则失败变为 OK)。这也是我在 /var/lib/mysql 时得到的结果:drwxrwxr-x 4 1002 1003 4096 Feb 8 02:25 mysql.
  • 用 && sleep infinity 替换 && bash 没有区别,容器在 30 秒后崩溃。 ~/vol 文件夹也有 775 个权限。

标签: mysql docker containers docker-volume


【解决方案1】:

这是因为您使用 ~/vol 的内容掩盖了 /var/lib/mysql 的内容,我假设它是空的。因此 MySQL 服务器无法启动,因为它缺少数据库文件。我个人会在您的自定义实现上使用官方图像,因为它将处理您正在寻找的 here is the link to Dockerhub。如果您需要这些更改,它可以选择挂载您的自定义 my.cnf 文件。但是默认情况下,图像确实绑定到 0.0.0.0。有关配置选项,请参阅 Dockerhub 链接。

希望对你有帮助

迪伦

【讨论】:

  • 谢谢。是的,我现在正在使用官方图片,效果很好。我只是想了解为什么添加卷会使其崩溃。你说的很有道理,尽管即使~/var 中的所有数据都是正确的(通过不同的卷从另一个容器中复制出来),我的容器仍然会崩溃。我认为也许将这与更改某些权限相结合可能会起作用?我目前对这个问题的解决方案是在其他地方安装一个卷并运行一个 cronjob 来复制所有内容(这很丑陋)。我绝对认为要更深入地了解 Docker 容器的工作原理。谢谢!
  • 很高兴它帮助解决了您的问题 - 作为一般规则,而不是滚动您自己的 Docker 图像,我会以官方图像为基础并在顶部进行任何自定义,因为它们真的非常好。 Docker 中的权限可能会很痛苦,我建议在这样的副本之后使用chown -R root:root <DIR>,以明确定义您的权限并排除这种情况。只要文件的 UID 为零,即 root,它就应该避免任何与权限相关的问题。请问你为什么需要这个副本?另外,如果这解决了,请标记为已解决:) 很乐意进一步帮助,只需喊叫
猜你喜欢
  • 2018-03-18
  • 2020-07-21
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2015-07-25
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多