Project/Collabo Project

[Villion] Docker를 실행 할 때 데이터 넣기

sesam 2024. 5. 30. 12:50
728x90

컴퓨터를 포맷하게 되면서 모든 세팅을 새롭해 해야했다.

그러면서 db파일 세팅, 데이터 넣기 등 다 하나하나 설정을 해줘야 했다.

프로그램이 실행될 때 mysql 데이터베이스 파일과 더미데이터를 자동으로 넣고 싶었다.

 

결론은 Docker를 실행할 때 mysql 데이터베이스 파일을 만들고 더미데이터를 넣는 것으로 해결했다.

 

 


 

 

  • mysql.yml

파일을 만들어서 두고

더보기
version: '3'

services:
  mysql:
    image: mysql:latest
    container_name: my-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 1234
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql
      - ./Aladin_Weekly_Best_Sellers_Domestic_Books.csv:/var/lib/mysql-files/data.csv
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - test-net
volumes:
  mysql-data:

networks:
  test-net:
    external: true

volumes:

./mysql-data:/var/lib/mysql

호스트의 ./mysql-data 디렉토리를 MySQL 컨테이너의 /var/lib/mysql 디렉토리에 마운트한다.

이 볼륨은 MySQL 데이터베이스 데이터를 저장하여 컨테이너가 재시작되더라도 데이터가 유지되도록 한다.

 

./Aladin_Weekly_Best_Sellers_Domestic_Books.csv:/var/lib/mysql-files/data.csv

호스트의 ./Aladin_Weekly_Best_Sellers_Domestic_Books.csv 파일을 컨테이너의 /var/lib/mysql-files/data.csv 경로에 마운트한다.
이 설정을 통해 LOAD DATA INFILE 명령이 이 파일을 읽을 수 있도록 한다.

 

./init.sql:/docker-entrypoint-initdb.d/init.sql

호스트의 ./init.sql 파일을 컨테이너의 /docker-entrypoint-initdb.d/init.sql 경로에 마운트한다.
MySQL 컨테이너가 시작될 때 이 스크립트를 실행하여 초기 설정을 수행한다.

 

init.sql 을 확인해보자!

 

 

  • init.sql
더보기
-- init.sql 파일 내용
CREATE DATABASE IF NOT EXISTS villion_user;
CREATE DATABASE IF NOT EXISTS villion_book;
CREATE DATABASE IF NOT EXISTS villion_rental;


USE villion_book


CREATE TABLE books (
                      PRIMARY KEY (id),
                      id INT,
                      category VARCHAR(20),
                      bookName VARCHAR(255),
                      itemId VARCHAR(20),
                      isbn13 VARCHAR(20),
                      additionalCode VARCHAR(20),
                      author VARCHAR(100),
                      publisher VARCHAR(100),
                      publicationDate DATE,
                      originalPrice VARCHAR(100),
                      sellingPrice VARCHAR(100),
                      mainGenre VARCHAR(100),
                      englishMainGenre VARCHAR(100),
                      productGroup VARCHAR(100)
);


LOAD DATA INFILE '/var/lib/mysql-files/data.csv' // 👀 mysql.yml volumes에서 경로를 지정해줬다.
INTO TABLE books
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

SHOW VARIABLES LIKE 'secure_file_priv';

 

💡 '/var/lib/mysql-files/data.csv' 더미파일을 /var/lib 에 넣어둔 이유?
참고링크 MySQL 데이터 추출 및 --secure-file-priv 옵션

내가 원하는 폴더에 넣어서 읽어오게 하면 --secure-file-priv 옵션에 의한 에러가 발생한다.
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement​

이와 같은 에러는 --secure-file-priv 옵션이 MySQL 서버가 파일을 읽거나 쓸 수 있는 디렉토리를 제한하기 때문에 발생한다.

TROUBLE SHOOTING
secure_file_priv 가 가리키는 Value 필드를 보면 /var/lib/mysql-files/ 와 같이 디렉토리 형식으로 출력이 된 것을 볼 수 있는데, 이 디렉토리가 secure_file_priv 옵션이 허용한 MySQL 서버가 읽고 쓸 수 있는 디렉토리이다.
즉, INTO OUTPUT 문 다음의 디렉토리를 이 곳으로 쓰면 된다.


SOLUTION
쿼리문에서 추출할 디렉토리를 secure_file_priv 가 허용하는 곳으로 변경하면된다.

 

 

 

 

  • Docker compse

mysql.yml을 읽어온다

docker-compose -f mysql.yml up -d