Je dispose d'un programme Java et mysql est un conteneur Docker (image: mysql:5.7.20). Mon MacOs est High Sierra 10.13.4.
Le problème en bref
À l'aide de Docker sur MacOS (10.13.4.). À l'intérieur d'un conteneur docker (image: mysql:5.7.20), principalement les requêtes (exécuté à partir d'un programme java)
LOAD DATA INFILE ...
SELECT ... INTO OUTFILE ...
fonctionnent très bien, mais parfois, le programme java jette les exceptions:
- SQLException: can't create/write to file ‘...' (Errcode: 2 - Aucun fichier ou répertoire)
- SQLException: ne Peut pas obtenir stat de ‘...' Errcode: 2 - Aucun fichier ou répertoire)
- SQLException: Le serveur MySQL est en cours d'exécution avec l'option --sécurisé de fichiers priv option de sorte qu'il ne peut pas exécuter cette instruction
- SQLException: Fichier ‘...' not found (Errcode: 2 - Aucun fichier ou répertoire)
btw. le fichier existe et les autorisations doivent être fine (voir la version longue)
La version longue
Le processus est le suivant:
- un .fichier csv est créé
- c' .csv fichier est copié dans un répertoire, qui est monté pour le conteneur docker
- docker-composer des volumes de l'article:
- "./data/datahub/import:/var/lib/mysql-files/datahub/import"
- docker-composer des volumes de l'article:
- puis MySQL lit ce .fichier csv dans une table:
LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';
- puis quelques trucs sur la base de données qui se passe
- après que MySQL écrit une .csv fichier de sortie
-
SELECT
tbl.
sku,
tbl.
supprimé,
tbl.
data_source_valuesINTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ...
-
Ce projet a certaines java intégration-tests pour ce processus. Ces tests sont le plus souvent verts, mais parfois ils échouent avec:
- SQLException: can't create/write to file ‘...' (Errcode: 2 - Aucun fichier ou répertoire)
- SQLException: ne Peut pas obtenir stat de ‘...' Errcode: 2 - Aucun fichier ou répertoire)
- SQLException: Le serveur MySQL est en cours d'exécution avec l'option --sécurisé de fichiers priv option de sorte qu'il ne peut pas exécuter cette instruction
- SQLException: Fichier ‘...' not found (Errcode: 2 - Aucun fichier ou répertoire)
Le docker-composition de fichier ressemble à ceci:
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:
Le Journal à partir de ce menu fixe conteneur de base de données est le suivant (mais parfois, ce qui s'est passé lorsque tous les tests sont vertes, trop)
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)
L' .fichier csv à l'intérieur de la datahub conteneur, le suivant, 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
Je pense qu'il n'y a pas de problème, que ce fichier appartient à la racine, car pour la plupart ce fichier peut être lu par MySQL. Lorsque je change d'utilisateur mysql
par su mysql
à l'intérieur du conteneur Docker, je reçois le texte suivant:
$ 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
Maintenant, certaines choses étranges qui s'est passé.
- avec l'utilisateur root, j'ai pu faire une
cat deactivated_product_merged_bub.csv
- avec utilisateur mysql je ne pouvais pas j'ai eu:
Sortie:
$ cat deactivated_product_merge_bub.csv
cat: deactivated_product_merge_bub.csv: No such file or directory
J'ai fait un stat deactivated_product_merged_bub.csv
comme utilisateur MySQL et tout à coup j'ai pu faire une cat
sur ce fichier (comme vous le voyez j' chmod 777
de ce fichier pour obtenir le cat
de travail - mais il ne fonctionne pas).
-
stat
en tant que root
Sortie:
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
comme utilisateur mysql
Sortie:
$ 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: -
Question
Personne ne sait ce qui s'est passé ici, ou qui a un indice de ce que je pouvais de recherche à creuser plus profond?
À mon avis, c'est que c'est parce que l'utilisation de Docker avec MacOs et le volume monté.