jdk10 - macbook pro java jdk download



MacOS 시스템의 MySQL도 커 컨테이너 INFILE/INTO OUTFILE 문 (1)

나는 자바 프로그램과 mysql Docker 컨테이너를 가지고있다 (image : mysql : 5.7.20). 내 MacOs는 High Sierra 10.13.4입니다.

짧은 문제

MacOS에서 Docker 사용하기 (10.13.4.). 도커 컨테이너 (image : mysql : 5.7.20) 대부분은 질의 (java 프로그램에서 실행 됨)

  • LOAD DATA INFILE ...
  • SELECT ... INTO OUTFILE ...

잘 작동하지만 때로는 자바 프로그램이 예외를 throw합니다.

  • SQLException : 파일 '...'(Errcode : 2 - 해당 파일이나 디렉토리가 없음)을 만들거나 쓸 수 없습니다.
  • SQLException : '...'합계를 가져올 수 없습니다. Errcode : 2 - 해당 파일이나 디렉토리가 없습니다.)
  • SQLException - MySQL 서버가 --secure-file-priv 옵션을 사용하여 실행 중이므로이 명령문을 실행할 수 없습니다.
  • SQLException : '...'파일을 찾을 수 없습니다 (Errcode : 2 - 그런 파일이나 디렉토리가 없습니다)

btw. 파일이 존재하고 사용 권한이 양호해야합니다 (긴 버전 참조).

더 긴 버전

프로세스는 다음과 같습니다.

  • .csv 파일 생성
  • 이 .csv 파일은 도커 컨테이너 용으로 마운트 된 디렉토리에 복사됩니다.
    • 도커 작성 볼륨 섹션 : - "./data/datahub/import:/var/lib/mysql-files/datahub/import"
  • MySQL은이 .csv 파일을 테이블로 읽습니다 :
    • LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';
  • 그 데이터베이스의 일부 내용이 발생합니다.
  • 그 후 MySQL은 .csv 출력 파일을 작성한다.
    • SELECT tbl . sku , tbl . 삭제됨 , tbl . data_source_values INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ... INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ...

이 프로젝트에는이 프로세스에 대한 몇 가지 Java 통합 테스트가 있습니다. 이 테스트는 대부분 녹색이지만 때때로 실패합니다.

  • SQLException : 파일 '...'(Errcode : 2 - 해당 파일이나 디렉토리가 없음)을 만들거나 쓸 수 없습니다.
  • SQLException : '...'합계를 가져올 수 없습니다. Errcode : 2 - 해당 파일이나 디렉토리가 없습니다.)
  • SQLException - MySQL 서버가 --secure-file-priv 옵션을 사용하여 실행 중이므로이 명령문을 실행할 수 없습니다.
  • SQLException : '...'파일을 찾을 수 없습니다 (Errcode : 2 - 그런 파일이나 디렉토리가 없습니다)

도커 작성 파일은 다음과 같습니다.

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 파일은 다음을 보여줍니다. ls -lha

[email protected]:/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에 의해 읽힐 수 있기 때문에,이 파일이 루트에 속한다는 것은 문제가 없다고 생각한다. Docker 컨테이너 안에 su mysql 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_merged_bub.csv
  • mysql 사용자와 나는 내가 가질 수 없었다 :

산출:

$ cat deactivated_product_merge_bub.csv
cat: deactivated_product_merge_bub.csv: No such file or directory

내가 stat deactivated_product_merged_bub.csv 를 mysql 사용자로 만들었고, 갑자기 그 파일에 cat 를 만들 수 있었다. (내가 chmod 777 을 보았 기 때문에 그 파일이 cat 에게 효과가있다.하지만 작동하지 않았다.)

  • 루트로서의 stat

산출:

[email protected]:/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: -
  • mysql 사용자로 stat

산출:

$ 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: -

의문

아무도 모르고, 여기 무슨 일이 있었는지, 내가 더 깊게 파고들 수있는 것에 대한 암시를 가지고 있습니까?

나의 추측은 Docker와 MacOs 및 마운트 된 볼륨을 사용하기 때문입니다.


Mac 용 docker의 기본 공유 경로를 벗어나는 파일에 액세스하려고 시도했을 수 있습니다 (docker osx 설명서 참조).

기본적으로 / Users /, / Volumes /, / private / 및 / tmp에 직접 파일을 공유 할 수 있습니다. Docker로 내 보낸 디렉토리 트리를 추가하거나 제거하려면 Docker 환경 설정 고래 메뉴 -> 환경 설정 -> 파일 공유에서 파일 공유 탭을 사용하십시오. (환경 설정을 참조하십시오.)

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

이 경우 Mac 용 도커는 Mac OS에서 hyperkit으로 실행되는 Linux 가상 머신을 사용합니다. 클라이언트는 macOSx에서 실행되고 데몬은 VM에서 실행됩니다. 이는 제한된 경로 목록에서 파일을 공유해야한다고 설명합니다.





docker-compose