Não foi possível montar a pasta docker no host usando o docker-compose

7

Aqui eu criei o container docker que usa a mariadbimagem e criei três volumes, como abaixo.

docker-compose.yml

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

Os dois primeiros volumes funcionam com êxito, mas não consigo encontrar os arquivos mariadb-logs na logspasta. Parece logspasta mostrando em branco no host, bem como no recipiente (/ var / log / mysql). Acho pasta host substituir no sistema de arquivos docker.

Se eu remover esse volume ( ./logs:/var/log/mysql) da janela de encaixe, os arquivos de log serão exibidos no contêiner.

Meu plano é montar a /var/log/mysql/pasta na máquina local.

Obrigado !

Ponteiro nulo
fonte
Experimente o chmod 777 /var/log/mysqlseu host, aposto que seu daemon está sendo executado, pois o mysqlusuário não tem direitos para escrever neste diretório no seu host. Depois disso, você terá que encontrar o ID do usuário do mysql dentro do contêiner chownpara evitar que todos leiam e escrevam seus logs de banco de dados.
Tensibai
Talvez o selinux ou o apparmor esteja ativado
030
Estou usando Debianos e apparmor já desativados.
Nullpointer 18/09

Respostas:

3

Se você estiver executando uma distribuição baseada em RedHat, por exemplo, Fedora ou CentOS, poderá ter o SELinux ativado por padrão. Você pode permitir automaticamente que seus contêineres acessem arquivos nos hosts montando com a :Zopção, da seguinte maneira:

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

Se /var/log/mysql:/var/log/mysqlfor definido como um volume, o conteúdo que residir no contêiner /var/log/mysql/será armazenado na /var/log/mysql/pasta no host.

Pode ser possível que não seja possível montar o /var/lib/mysqlSElinux ou a armadura do aplicativo está impedindo isso.

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

Observe que usuários em sistemas host com o SELinux ativado podem ver problemas com isso. A solução atual é atribuir o tipo de política SELinux relevante ao novo diretório de dados para que o contêiner tenha permissão para acessá-lo:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir
030
fonte
sim, eu concordo, o ./databasevolume está funcionando bem e, mesmo que eu crie um arquivo na ./logspasta no host, ele será exibido no contêiner, mas o volume não funcionará na ordem inversa.
Nullpointer
Se, por exemplo, o contêiner mysql do dockerhub for executado e o banco de dados for armazenado em / var / lib / mysql, o contêiner for reinicializado, o banco de dados que reside no host também será encontrado no contêiner
030