在这里,我创建了使用mariadb映像的docker容器,并创建了三个卷,如下所示。
version: '2.0'

services:
  mariadb:
  image: mariadb:latest
  restart: always
  container_name: mariadb
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=testdb
  ports:
   - 3307:3306
  volumes:
   - ./database:/var/lib/mysql
   - ./_conf/mariadb.cnf:/etc/mysql/my.cnf:ro
   - ./logs:/var/log/mysql

前两个卷成功运行,但是我找不到mariadb-将文件记录到logs文件夹中。我似乎logs文件夹在主机以及容器(/ var / log / mysql)上显示为空白。我认为主机文件夹将覆盖到docker文件系统中。
如果我从docker-compose中删除此卷(./logs:/var/log/mysql),则日志文件将显示在容器上。
我的计划是将/var/log/mysql/文件夹安装到本地计算机上。 br />谢谢!

评论

在主机上尝试chmod 777 / var / log / mysql,我敢打赌,以mysql用户身份运行的守护进程无权在主机上的该目录中写入。之后,您将必须在容器内找到mysql用户ID进行修改,以免让每个人都读入自己的数据库日志。

selinux或apparmor可能已激活

我正在使用Debian os,并且apparmor已经停用。

#1 楼

如果您使用CentOS 7(如我所用)。您可能默认情况下已打开SELinux。检查https://www.rootusers.com/how-to-enable-or-disable-selinux-in-centos-rhel-7/
或这样安装:

  volumes:
   - ./database:/var/lib/mysql:Z
   - ./_conf/mariadb.cnf:/etc/mysql/my.cnf:Z
   - ./logs:/var/log/mysql:Z


#2 楼

如果您正在运行基于RedHat的发行版,例如在Fedora或CentOS上,默认情况下您可能已打开SELinux。通过安装:Z选项,可以自动允许容器访问主机上的文件,如下所示:

  volumes:
   - ./database:/var/lib/mysql:Z
   - ./_conf/mariadb.cnf:/etc/mysql/my.cnf:Z
   - ./logs:/var/log/mysql:Z


#3 楼

如果将/var/log/mysql:/var/log/mysql定义为卷,那么位于容器/var/log/mysql/中的内容将存储在主机上的/var/log/mysql/文件夹中。

可能无法将/var/lib/mysql挂载为SElinux或应用程序防护阻止了此操作。

https://hub.docker.com/_/mysql/


请注意,启用了SELinux的主机系统上的用户可能会看到与此相关的问题
。当前的解决方法是将相关的SELinux策略类型分配给新的数据目录,以便可以
访问该容器:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir



评论


是的,我同意,。/ database卷工作正常,即使我在主机上的./logs文件夹上创建文件,它也将显示在容器上,但卷不能按反转顺序工作。

–空指针
17年9月8日在6:53



例如,如果运行了来自dockerhub的mysql容器并将数据库存储在/ var / lib / mysql中,则该容器将重新启动,然后也会在该容器中找到主机上的数据库

– 030
17年9月8日在7:07