2016-05-03 10 views
1

で世界書き込み可能なMySQLエラーを修正:私は、このようなコンテナが定義されているデシベルのため、ドッカ - コンを使用していドッカー

db: 
    build: ../builds/mysql-5.7 
    environment: 
    - MYSQL_ROOT_PASSWORD=pass 
    - MYSQL_DATABASE= 
    - MYSQL_USER= 
    - MYSQL_PASSWORD= 
    expose: 
    - 3306 
    volumes: 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/data/:/var/lib/mysql/ 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/conf.d/:/etc/mysql/conf.d/ 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/log/:/var/log/mysql/ 

このイメージの私のDockerfileがある:で

# Base image 
FROM mysql:5.7 

# Set valid file permissions - otherwise MySql won't read those files 

#COPY mysql-perm-fix.sh /etc/init.d/mysql-perm-fix.sh 
#RUN chmod +x /etc/init.d/mysql-perm-fix.sh 
#RUN update-rc.d mysql-perm-fix.sh defaults 100 

#RUN mkdir /etc/mysql/conf.d/source 
#RUN cp /etc/mysql/conf.d/source/my.cnf /etc/mysql/conf.d/my.cnf 
#RUN chmod -R 644 /etc/mysql/conf.d 

すべてが基本MySqlイメージを除いてコメントされています。私は私のコンテナを起動したとき

問題は、私のMySQL CNFファイルがあるため、この警告のMySQLが使用されることはありませんされています

のmysqld:[警告]世界の書き込み可能な設定ファイル「の/ etc/mysql/conf.d/my.cnf 'は無視されます。

私はホストシステムとしてWindowsを使用しています。問題は、Dockerが完全な権限を持つディレクトリをマウントし、変更できないことです。

質問 - どのように解決できますか?あなたが私のDockerfileで見てきたように、私はいくつかの解決法を試しましたが、それらのどれも私のために働いていません(しかし、おそらく私は何か間違っています)。

現時点で最も合理的な解決策は、/etc/mysql/conf.d/に直接ではなく、他のディレクトリにMySqlのconfファイルをマウントし、MySqlを起動して777のアクセス権ではなくそれらのファイルを/etc/mysql/conf.d/ディレクトリにコピーすることです。私はそれを試してみましたが、Dockerfileではそれらのファイルはまだ存在しないのでコピーできません。

解決方法はありますか?または、おそらく、いくつかのMySQLの設定は、confファイルのアクセス許可を気にしないように変更することができますか?

私は複数のサイトでこれらのイメージを使いたいので、Dockerfile内のCOPYを(ボリュームを使用する代わりに)Mysql設定ファイルをコピーするのに単純に使うことはできません。

答えて

1

これは、Windowsホストを使用すると、ドッカー容器内で目的のディレクトリにそれらのファイルをコピーし、「中間ディレクトリ」とファイルを共有しているときいっぱいでない権限でファイルを持つためのソリューションです。上記の場合

(MySQLのコンテナ)、それは次のように行うことができる(あなたが他のケースでも、この方法を使用することができます)

Dockerfile

# Base image 
FROM mysql:5.7 

# Copy starting scripts file 
COPY start.sh /root/start.sh 

# Run necessary services 
CMD ["/bin/bash", "/root/start.sh"] 

ドッキングウィンドウ-compose.yml (db容器のみを表示)

db: 
    build: ../builds/mysql-5.7 
    environment: 
    - MYSQL_ROOT_PASSWORD=pass 
    - MYSQL_DATABASE= 
    - MYSQL_USER= 
    - MYSQL_PASSWORD= 
    expose: 
    - 3306 
    volumes: 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/data/:/var/lib/mysql/ 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/conf.d/:/etc/mysql/conf.d/source 
    - /c/Users/marcin/dock-test/composers/l1.app/mysql/log/:/var/log/mysql/ 

上記の私たちはconf.ddディレクトリは/etc/mysql/conf.d/sourceディレクトリにあり、/etc/mysql/conf.d/ディレクトリにはなりません(MySqlはこのファイルをロードしません)。

start.sh

#!/bin/sh 

cp /etc/mysql/conf.d/source/* /etc/mysql/conf.d/ 

/entrypoint.sh mysqld 

我々が直接conf.dconf.d/sourceから今、すべてのファイルをコピーの上に - 彼らは、Linuxのパーミッションで作成されますので、それらのファイルは、Windowsホストで共有されていない(私の場合残しデフォルトで - chmodを使わないと良いです)。カスタムMySQLの設定値は、現在ロードされているかどうかを確認するには

私が実行します。

mysql -u root -p 

とパスワードを入力します。

SHOW VARIABLES;と入力すると、以前は(このファイルに異なる値が設定されていなかった)my.cnfの設定が表示されるため、期待どおりに動作しています。

もちろん、この解決法の欠点は、これらのファイルは実際には共有されないため、Dockerマシンでこれらのファイルが変更されると、Windowsホストでは更新されませんが、カスタム設定ファイルを使用しても差異はなく、問題を解決できます。

0

現在、ボリュームホストマウントを使用しています。ホストがWindowsであるため、アクセス権に問題があります。

configsにボリュームを使用する主な理由は、コンテナ間で共有できるようにするためです。データボリュームコンテナを使用することをお勧めします。

データボリュームコンテナには共有したいボリュームがあり、それらはLinuxマウントになるため、アクセス権の問題はなくなります。

他のコンテナは、構成ボリューム用のデータコンテナボリュームを使用します。

データコンテナの作成と使用に関する情報は、こちらをご覧ください。

https://docs.docker.com/engine/userguide/containers/dockervolumes/#creating-and-mounting-a-data-volume-container

あなたのデータボリュームのコンテナの設定をしたら、あなたは、コンテナにリンクしてボリュームを接続するドッキングウィンドウの実行時に--volumes-からフラグを使用します。

この方法は、すべてのボリュームで使用できます。ほんのわずかですが、これまでに何が好きですか。

他のコンテナ間でデータを共有する必要がない場合は、通常のボリュームを使用し、マウントされたボリュームをホストしないこともできます。これにより、Linuxではボリュームが作成されますが、Windowsホストにはマウントされません。 1つのディレクトリ名でボリュームをリストするだけでそれを実行できます。

Volumes 
- /var/lib/mysql 
- /etc/mysql 
+0

問題は、コンテナ間でそれらのボリュームを共有したくないということです。私はちょうど私のホストシステム(Windows)のMySqlコンテナに持っているコンテナのcnfファイルに含める必要があります。 –

+0

私はコンテナ間で共有しないという答えに別のオプションを追加しましたが、それはホストから引き出されません。私は他のことを考えることができるかどうかを見ていきます。 –

+0

ありがとうございました。それは私がこれを解決することができたようだ(私の答えを参照してください) –

0

感謝のために@ marcin-nabiałekのおかげで、私はまだコマンドを実行するためのカスタムスクリプトを書かなくても、この解決策を手に入れました。スクリプトの内容は、Dockerfileコマンドで完了している可能性があります(mariadb/Dockerfileの内容を参照)。

私はproject-rootディレクトリにdocker-compose -p my_project up --build -dを実行します。

ファイルの構造は次のとおりです。project-root

drwxr-xr-x 1 cmeza 197121 0 Aug 22 16:19 .git/ 
-rw-r--r-- 1 cmeza 197121 40 Aug 22 15:41 .gitignore 
-rw-r--r-- 1 cmeza 197121 1056 Aug 22 13:24 Dockerfile 
-rw-r--r-- 1 cmeza 197121 291 Aug 22 13:24 PROJECT.md 
-rw-r--r-- 1 cmeza 197121 3642 Aug 22 13:24 README.md 
drwxr-xr-x 1 cmeza 197121 0 Aug 22 13:24 bin/ 
-rw-r--r-- 1 cmeza 197121 944 Aug 22 15:42 docker-compose.yml 
drwxr-xr-x 1 cmeza 197121 0 Aug 22 15:41 mariadb/ 

project-root/mariadb

(other services here) 

db: 
    environment: 
     - MYSQL_ROOT_PASSWORD=my_super_secret_password 
     - MYSQL_DATABASE=my_db 
    ports: 
     - "3306:3306" 
    volumes: 
     - ./mariadb/entrypoint:/docker-entrypoint-initdb.d 
     - ./mariadb/conf:/etc/mysql/conf.d/my_conf_files 
     - ./mariadb/data:/var/lib/mysql 
     - ./mariadb/log:/var/log/mysql 
    build: ./mariadb 
    entrypoint: 
     - docker-entrypoint.sh 
     - mysqld 

(some other services here) 

mariadb/Dockerfile

-rw-r--r-- 1 cmeza 197121 193 Aug 22 15:46 Dockerfile 
drwxrwxrwx 1 cmeza 197121 0 Aug 22 13:57 conf/  
-rwxrwxrwx 1 cmeza 197121 5013 Aug 22 13:57 conf/my_custom.cnf 
drwxrwxrwx 1 cmeza 197121 0 Aug 22 16:07 data/ 
-rwxrwxrwx 1 cmeza 197121 0 Aug 22 16:07 data/.gitignore  
drwxrwxrwx 1 cmeza 197121 0 Aug 22 16:06 entrypoint/ 
-rwxrwxrwx 1 cmeza 197121 1163 Aug 22 16:06 entrypoint/default.sql 
drwxrwxrwx 1 cmeza 197121 0 Aug 22 15:52 log/ 
-rwxrwxrwx 1 cmeza 197121 0 Aug 22 15:52 log/.gitignore 

docker-compose.yml(ボリュームの相対パスに注意してください)これは私に必要なものすべてを手に入れました&私はまだ頭の中に髪が残っています。これが他の人に役立つかどうか私に教えてください。

関連する問題