Docker-Ordner kann mit Docker-Compose nicht in den Host eingebunden werden

7

Hier habe ich einen Docker-Container erstellt, der das mariadbImage verwendet, und drei Volumes wie folgt erstellt.

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

Die ersten beiden Volumes funktionieren erfolgreich, aber ich kann keine Mariadb-Protokolldateien im logsOrdner finden. Der logsOrdner wird sowohl auf dem Host als auch auf dem Container (/ var / log / mysql) leer angezeigt. Ich denke, Host-Ordner überschreiben in Docker-Dateisystem.

Wenn ich dieses Volume ( ./logs:/var/log/mysql) aus Docker-Compose entferne , werden Protokolldateien auf dem Container angezeigt.

Mein Plan ist es, /var/log/mysql/Ordner auf lokalen Computer zu mounten .

Vielen Dank !

Null Zeiger
quelle
Probieren Sie chmod 777 /var/log/mysqlIhren Host aus. Ich wette, Ihr Daemon wird ausgeführt, da der mysqlBenutzer keine Rechte hat, in dieses Verzeichnis auf Ihrem Host zu schreiben. Danach müssen Sie die MySQL-Benutzer-ID im Container finden, um chownzu vermeiden, dass jeder Ihre Datenbankprotokolle liest und schreibt.
Tensibai
Vielleicht ist Selinux oder Apparmor aktiviert
030
Ich benutze DebianOS und Apparmor bereits deaktiviert.
Nullpointer

Antworten:

3

Wenn Sie eine RedHat-basierte Distribution ausführen, z. B. Fedora oder CentOS, ist SELinux möglicherweise standardmäßig aktiviert. Sie können Ihren Containern automatisch erlauben, auf Dateien auf den Hosts zuzugreifen, indem Sie die folgende :ZOption bereitstellen:

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

Wenn /var/log/mysql:/var/log/mysqles sich um ein Volume handelt, wird der Inhalt des Containers /var/log/mysql/im /var/log/mysql/Ordner auf dem Host gespeichert .

Es ist möglich, dass es nicht möglich ist, die zu montieren, /var/lib/mysqlda SElinux oder App-Rüstung dies verhindert.

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

Beachten Sie, dass Benutzer auf Hostsystemen mit aktiviertem SELinux möglicherweise Probleme damit haben. Die aktuelle Problemumgehung besteht darin, dem neuen Datenverzeichnis den entsprechenden SELinux-Richtlinientyp zuzuweisen, damit der Container darauf zugreifen kann:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir
030
quelle
Ja, ich stimme zu, das ./databaseVolume funktioniert einwandfrei und selbst wenn ich eine Datei im ./logsOrdner auf dem Host erstelle , wird sie auf dem Container angezeigt, aber das Volume funktioniert nicht in umgekehrter Reihenfolge.
Nullpointer
Wenn zum Beispiel der MySQL-Container von Dockerhub ausgeführt und die Datenbank in / var / lib / MySQL gespeichert wird, wird der Container neu gestartet, und die Datenbank, die sich auf dem Host befindet, befindet sich ebenfalls im Container
030