Javaプログラムとmysql Dockerコンテナ(画像:mysql:5.7.20)を使用しています)私のMacOはHigh Sierra 10.13.4です。
要するに問題
MacOS(10.13.4。)でのDockerの使用。 Dockerコンテナー(画像:mysql:5.7.20)の内部では、ほとんどのクエリ(Javaプログラムから実行)
LOAD DATA INFILE ...
_SELECT ... INTO OUTFILE ...
_は正常に動作していますが、Javaプログラムが例外をスローする場合があります。
ところで。ファイルが存在し、権限が適切である必要があります(長いバージョンを参照)
長いバージョン
プロセスは次のとおりです。
- "./data/datahub/import:/var/lib/mysql-files/datahub/import"
_LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';
_SELECT
tbl _.
_ sku _,
_ tbl _.
_ deleted _,
_ tbl _.
_ data_source_values _INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ...
_このプロジェクトにはいくつかのJavaこのプロセスの統合テストがあります。これらのテストは大部分がグリーンですが、失敗する場合があります:
Docker-composeファイルは次のようになります。
_version: '3'
services:
datahub_db:
image: "mysql:5.7.20"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${DATAHUB_DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DATAHUB_DB_DATABASE}
volumes:
- "datahub_db:/var/lib/mysql"
- "./data/datahub/import:/var/lib/mysql-files/datahub/import"
- "./data/akeneo/import:/var/lib/mysql-files/akeneo/import"
ports:
- "${DATAHUB_DB_PORT}:3306"
...
volumes:
datahub_db:
_
そのDockerデータベースコンテナーのログには次のように表示されます(ただし、すべてのテストが緑色の場合にも発生することがあります)
datahub_db_1 | 2018-06-01T10:04:33.937646Z 144 [Note] Aborted connection 144 to db: 'datahub_test' user: 'root' Host: '172.18.0.1' (Got an error reading communication packets)
Datahubコンテナー内の.csvファイルは、次のように表示されます、fo _ls -lha
_
_root@e02e2074fb6b:/var/lib/mysql-
files/datahub/import/test/products/kaw# ls -lha
total 4.0K
drwxr-xr-x 3 root root 96 Jun 1 09:36 .
drwxr-xr-x 3 root root 96 Jun 1 09:36 ..
-rw-r--r-- 1 root root 378 Jun 1 06:47 deactivated_product_merged_bub.csv
_
ほとんどの場合、このファイルはMySQLで読み取ることができるため、このファイルはrootに属していることは問題ないと思います。 Dockerコンテナー内の_su mysql
_を介してユーザーmysql
に変更すると、次のようになります。
_$ ls -al
total 4
drwxr-xr-x 3 mysql mysql 96 Jun 1 09:36 .
drwxr-xr-x 3 mysql mysql 96 Jun 1 09:36 ..
-rw-r--r-- 1 mysql mysql 378 Jun 1 06:47 deactivated_product_merged_bub.csv
_
今、いくつかの奇妙なことが起こりました。
cat deactivated_product_merged_bub.csv
_を作成できます出力:
_$ cat deactivated_product_merge_bub.csv
cat: deactivated_product_merge_bub.csv: No such file or directory
_
MySQLユーザーとして_stat deactivated_product_merged_bub.csv
_を作成しましたが、突然、そのファイルにcat
を作成できました(ご覧のとおり、cat
を機能させるためにそのファイルに_chmod 777
_を作成しました-しかし、それはうまくいきませんでした)。
stat
出力:
_root@e02e2074fb6b:/var/lib/mysql-files/datahub/import/test/products/kaw# stat
deactivated_product_merged_bub.csv
File: 'deactivated_product_merged_bub.csv'
Size: 378 Blocks: 8 IO Block: 4194304 regular file
Device: 4fh/79d Inode: 4112125 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-06-01 09:23:38.000000000 +0000
Modify: 2018-06-01 06:47:44.000000000 +0000
Change: 2018-06-01 09:04:53.000000000 +0000
Birth: -
_
stat
mysqlユーザーとして出力:
_$ stat deactivated_product_merged_bub.csv
File: 'deactivated_product_merged_bub.csv'
Size: 378 Blocks: 8 IO Block: 4194304 regular file
Device: 4fh/79d Inode: 4112125 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 999/ mysql) Gid: ( 999/ mysql)
Access: 2018-06-01 09:32:25.000000000 +0000
Modify: 2018-06-01 06:47:44.000000000 +0000
Change: 2018-06-01 09:04:53.000000000 +0000
Birth: -
_
質問
誰かが知っていますか、ここで何が起こったのか、私がDigをより深く検索するためのヒントがありますか?
私の推測では、MacOとマウントされたボリュームでDockerを使用しているためです。
Dockerコンテナーとホスト間でフォルダーを共有する権限に問題があると思います。 .envファイルでUIDを設定して、コンテナーのユーザーをホストのユーザーにマップする必要があります。
UID=501 # run echo $UID to get current user id
version: '3'
services:
datahub_db:
image: "mysql:5.7.20"
user: $UID
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${DATAHUB_DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DATAHUB_DB_DATABASE}
volumes:
- "datahub_db:/var/lib/mysql"
- "./data/datahub/import:/var/lib/mysql-files/datahub/import"
- "./data/akeneo/import:/var/lib/mysql-files/akeneo/import"
ports:
- "${DATAHUB_DB_PORT}:3306"
...
volumes:
datahub_db:
Mac用のドッカーのデフォルトの共有パスの外にあるファイルにアクセスしようとしている可能性があります(ドッカーのosxドキュメントから)
デフォルトでは、/ Users /、/ Volumes /、/ private /、および/ tmp内のファイルを直接共有できます。 Dockerにエクスポートされるディレクトリツリーを追加または削除するには、Docker設定のクジラメニュー-> [設定]-> [ファイル共有]の[ファイル共有]タブを使用します。 (設定を参照してください。)
この場合、Mac用のdockerは、Mac OS上のhyperkitによって実行されるLinux仮想マシンを使用しています。クライアントはmacOSxで実行され、デーモンはVMで実行されます。つまり、パスの制限されたリストでファイルを共有する必要があります。