docker-compose日常BUG

作者: Dsir 分类: Server 发布时间: 2018年07月26日 16时13分

前言

相信大家在刚接触docker-compose时常常会发生一些BUG而感觉苦恼,以下内容是我最近使用docker-compose碰到的BUG,希望那些跟我一样刚接触docker的小伙伴能少走些弯路。

示例

1、ERROR: The Compose file './docker-compose.yml' is invalid because: services.mysql.environment contains an invalid type, it should be an object, or an array services里的mysql下的environment 包含无效类型、应该是对象或数组。

之前:

    1525863721322807.png

之后:

    1525863934829612.png

设置环境变量有数组或字典2种格式:

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

出现这个错误,很可能是空格导致的,仔细检查下吧!


2、The Compose file './docker-compose.yml' is invalid because: Invalid top-level property "mysql". Valid top-level sections for this Compose file are: version, services, networks, volumes, and extensions starting with "x-".

之前:

    1525864190403670.png 

之后:

    1525864391403286.png

php属于服务类型,如果你写过python应该知道它是通过格式(空格)进行区分代码块的


3、The Compose file './docker-compose.yml' is invalid because:  services.nginx.ports is invalid: Invalid port "443: 443", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]   services.nginx.ports is invalid: Invalid port "80: 80", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]

之前:

    1525864851920158.png

之后:

    1525864881837979.png

4、docker: Error response from daemon: Mounts denied: The paths /var/folders/zz/... and /var/folders/zz/... are not shared from OS X and are not known to Docker. You can configure shared paths from Docker -> Preferences... -> File Sharing.

Docker for Mac卷装载的行为与基础Docker系统的行为不同。这主要是因为Docker试图遵守Apple的文件系统沙箱准则。

如Docker的首选项所示,macOS仅导出某些路径。

    1525864988615210.png

把需要挂载的目录增加在里面,docker重启之后就可以了

5、mac上运行docker-compose up编译提示权限问题,如下图所示:

    1525865111481123.png

之前docker run 时进行宿主机和容器进行目录挂载是完全可以的,但docker-compose时就会有权限问题。

nginx: [alert] could not open error log file: open() "/usr/local/nginx/logs/error.log" failed (13: Permission denied)

相信当大家在MAC上安装时候都提示了是否给Docker root用户权限,当时我赋予了Docker root权限,所以docker run 时候没有提示,而docker-compose跟docker不属于一个Group,那么自然会没有权限,所以我给了挂载目录一个777权限,在运行一次

docker-compose up 运行之后没有再提示权限问题。如果想要后台运行,那么在命令后面追加 -d 参数。


6、yaml.scanner.ScannerError: mapping values are not allowed here in "./docker-compose.yml", line 6, column 10

这是不符合yml文件的格式。

    1525865157463013.png

在image冒号后面是没有空格的,yml文件是要求每个冒号后面如果映射着值,那么需要我们在冒号后面加个空格。

    1525865189372170.png

注意:

    xxx: xxx (数组格式)

    - xxx:xxx(字典格式)

数组格式的时候需要我们在冒号后面加一个空格,而字典格式是不需要的,如果增加会像本章节第3小节一样的错误提示。


7、构建LNMP环境后只有本机可以访问,而局域网无法访问

本机打开浏览器访问本机 IP:80 正常,但同一个局域网内的其他机器通过 IP:80 访问就提示无法连接。着实困扰了一阵子。

经过排查,发现是 Docker 服务启动后使用了 80 端口并映射到本机的 80端口,而本机访问时因为走本地环回,所以其实本质上没有过 80 端口。

8、docker-compose up -d 容器无法启动

如果发现容器无法启动,首先查看日志信息查看是否出现错误

docker-compose logs 容器名称

如果出现错误信息,那么先把错误排查完之后再试试。如果还是无法启动,要么就是依赖的容器没有启动,要么就是容器内没有前台挂起某个程序,导致docker认为没有事情可干。

9、mysql | 2018-07-25T08:03:27.078317Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files

docker-compose 启动时mysql提示不存在mysql-files文件夹,这是因为mysql5.7新特性secure-file-priv

  • secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出

  • secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下

  • secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

1532513885190195.png

我在my.cnf中加入secur-file-priv = NULL解决这个问题

10、InnoDB: Table flags are 0 in the data dictionary but the flags in file ./ibdata1 are 0x4000!

截图.png

它是由错误“[ERROR] [致命] InnoDB引起的:数据字典中的表标志是0,但文件mysql.ibd中的标志是0x4000!”,这是因为挂载的mysql数据目录存在之前的数据,我们把存在的数据清空就好了


总结

本篇文章主要介绍docker-compose使用过程的一些小BUG,但几乎所有的新手都会经历这些,多尝试几次,多报一些错就能理解透彻。在下一篇文章中我会讲解如何使用docker-compose构建LNMP环境

可能大家感觉顺序有点错误,确实如此。由于我在不发博客度娘可能就会K我了,所以先发一篇避免度娘K我,但丝毫不影响本篇文章质量哦!!

如果觉得我的文章对您有用,请随意打赏、分享。您的支持将鼓励我继续创作!

微博分享
1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注