web-dev-qa-db-ja.com

docker mysqlコンテナーでのロギングを有効にする

私はドッカーのエコシステムに慣れ親しんで、mysqlデータベースコンテナーをセットアップしようとしました。 docker-composeこれは次のようになります。

version: '2'
services:
  db:
    image: mysql:5.6.33@sha256:31ad2efd094a1336ef1f8efaf40b88a5019778e7d9b8a8579a4f95a6be88eaba
    volumes:
      - "./db/data:/var/lib/mysql"
      - "./db/log:/var/log/mysql"
      - "./db/conf:/etc/mysql/conf.d"
    restart: "yes"
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

私のconfディレクトリには1つのファイルが含まれています:

[mysqld]
log_error       =/var/log/mysql/mysql_error.log
general_log_file=/var/log/mysql/mysql.log
general_log     =1
slow_query_log  =1
slow_query_log_file=/var/log/mysql/mysql_slow.log
long_query_time =2
log_queries_not_using_indexes = 1

残念ながら、そのようにログファイルを取得することはできません。セットアップ自体は正しく、cnfファイルが使用されます。コンテナーに接続して3つのファイルchownmysqlに作成し、コンテナーを再起動すると、ロギングは期待どおりに機能します。

これが一般的なシナリオであると確信しています。実行するための私の現在の方法は、本当にばかげているようです。 それを行う正しい方法は何ですか?

Dockerfileでこれらすべてを移動することでアプローチを改善できましたが、これはまだ奇妙に思えます。

13
mheinzerling

コンテナーに接続して3つのファイルを作成し、それらをmysqlに移行してコンテナーを再起動すると、ロギングは期待どおりに機能します。

これは、ホストボリュームの権限の問題を示しています。コンテナーからホストにマップする場合、ユーザーIDにはマッピングが行われず、コンテナー内のuidに添付された名前は外部とはかなり異なる場合があります。コンテナーユーザーが書き込み可能なものでディレクトリのアクセス許可を初期化する必要があります。簡単な方法の1つは、ホストとコンテナの両方のファイルへの書き込みアクセス権を持つグループを作成し、さまざまなユーザーをイメージとホストOSの両方でこのグループに追加することです。別のオプションは、ホストから直接アクセスしない名前付きファイルシステムを使用し、イメージのディレクトリ権限で初期化することです。


編集:docker-compose.ymlを使用した名前付きボリュームの例は次のように単純です:

version: '2'
volumes:
  mysql-data:
    driver: local
  mysql-log:
    driver: local
  mysql-conf:
    driver: local

services:
  db:
    image: mysql:5.6.33
    volumes:
      - "mysql-data:/var/lib/mysql"
      - "mysql-log:/var/log/mysql"
      - "mysql-conf:/etc/mysql/conf.d"
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: db
      MYSQL_USER: db
      MYSQL_PASSWORD: dbpw

画像名からsha256も削除したことに注意してください。この参照により、パッチが適用されたバージョンの画像をプルすることができなくなります。再起動時にDockerが予期したことを実行できるように、「停止しない限り」の再起動ポリシーも好みます。

4
BMitch

私はまったく同じものを探していましたが、今はもっと良い方法があります。

docker mysql は次のように記述します。

多くの構成オプションをフラグとしてmysqldに渡すことができます。これにより、cnfファイルを必要とせずにコンテナを柔軟にカスタマイズできます。たとえば、UTF-8(utf8mb4)を使用するようにすべてのテーブルのデフォルトのエンコーディングと照合を変更する場合は、次のコマンドを実行します。

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker-compose の世界では、サービスの "command" セクションを介してこれらの引数を渡すことができます。

command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

私の使用例では、ログをオンにして、ログファイルへのパスを指定したかっただけです。

 command: mysqld --general-log=1 --general-log-file=/var/log/mysql/general-log.log

適切なボリューム(例:- ./logs/mysql.log:/var/log/mysql/general-log.log)、それらに到達するのが簡単になります。

これは非常に簡単で、ローカル構成の処理を避けます。すべての MySQL Dockerイメージ で機能し、my.cnf画像に同梱されています。

6
ponsfrilus