web-dev-qa-db-ja.com

MySQL Docker Container INFILE / MacOSシステムのINTO OUTFILEステートメント

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プログラムが例外をスローする場合があります。

  • SQLException:Ca n't create/write to file ‘…’(Errcode:2-No such file or directory)
  • SQLException:「…」の統計を取得できませんエラーコード:2-そのようなファイルまたはディレクトリはありません)
  • SQLException:MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません
  • SQLException:ファイル ‘…’が見つかりません(エラーコード:2-そのようなファイルまたはディレクトリはありません)

ところで。ファイルが存在し、権限が適切である必要があります(長いバージョンを参照)

長いバージョン

プロセスは次のとおりです。

  • .csvファイルが作成されます
  • この.csvファイルは、Dockerコンテナー用にマウントされているディレクトリにコピーされます
    • docker-composeボリュームセクション:_- "./data/datahub/import:/var/lib/mysql-files/datahub/import"_
  • 次に、MySQLはこの.csvファイルをテーブルに読み込みます:
    • _LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';_
  • その後、そのデータベースにいくつかのことが起こります
  • その後、MySQLは.csv出力ファイルを書き込みます
    • SELECTtbl _._ sku _,_ tbl _._ deleted _,_ tbl _._ data_source_values _INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ..._

このプロジェクトにはいくつかのJavaこのプロセスの統合テストがあります。これらのテストは大部分がグリーンですが、失敗する場合があります:

  • SQLException:ファイル ‘…’を作成/書き込みできません(エラーコード:2-そのようなファイルまたはディレクトリはありません)
  • SQLException:「…」の統計を取得できませんエラーコード:2-そのようなファイルまたはディレクトリはありません)
  • SQLException:MySQLサーバーは--secure-file-privオプションで実行されているため、このステートメントを実行できません
  • SQLException:ファイル ‘…’が見つかりません(エラーコード:2-そのようなファイルまたはディレクトリはありません)

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
_

今、いくつかの奇妙なことが起こりました。

  • rootユーザーの場合、_cat deactivated_product_merged_bub.csv_を作成できます
  • mysqlユーザーでは私は手に入れることができませんでした:

出力:

_$ 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を使用しているためです。

27
SleepyX667

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:

0
Neda Peyrone

Mac用のドッカーのデフォルトの共有パスの外にあるファイルにアクセスしようとしている可能性があります(ドッカーのosxドキュメントから)

デフォルトでは、/ Users /、/ Volumes /、/ private /、および/ tmp内のファイルを直接共有できます。 Dockerにエクスポートされるディレクトリツリーを追加または削除するには、Docker設定のクジラメニュー-> [設定]-> [ファイル共有]の[ファイル共有]タブを使用します。 (設定を参照してください。)

https://docs.docker.com/docker-for-mac/osxfs/#namespaces

この場合、Mac用のdockerは、Mac OS上のhyperkitによって実行されるLinux仮想マシンを使用しています。クライアントはmacOSxで実行され、デーモンはVMで実行されます。つまり、パスの制限されたリストでファイルを共有する必要があります。

0
webofmars