programing

도커 컴포지트 시작 시 데이터베이스 작성

goodjava 2022. 11. 20. 11:10

도커 컴포지트 시작 시 데이터베이스 작성

docker-compose.yml 파일의 환경변수를 사용하여 MySQL 데이터베이스를 만들고 싶은데 작동하지 않습니다.다음 코드가 있습니다.

# The Database
database:
  image: mysql:5.7
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: homestead
    MYSQL_USER: root
    MYSQL_PASSWORD: secret
  ports:
    - "33061:3306"

누가 이 학교의 기능을 설명해 줄 수 있나요?

init "의 .mysql컨테이너가 생성될 때마다 적용됩니다.

database:
    image: mysql:5.7
    ports:
        - "33061:3306"
    command: --init-file /data/application/init.sql
    volumes:
        - ./init.sql:/data/application/init.sql
    environment:
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: homestead
        MYSQL_USER: root
        MYSQL_PASSWORD: secret

파일 「 」 「 。init.sql 에는 초기 및될 수 있습니다: ) 。하다

CREATE DATABASE IF NOT EXISTS dev;
CREATE DATABASE IF NOT EXISTS test;
USE dev;
CREATE TABLE IF NOT EXISTS (...);

는 이미 은 ""에 되어 있습니다./var/lib/mysql에도 유지됩니다. 해당 위치의 볼륨을 정의했으므로 Configuration은 재시작 후에도 유지됩니다.MySQL 이미지는 데이터베이스를 반복적으로 재구성하지 않습니다. 이 작업은 한 번만 수행됩니다.

volumes: - dbdata:/var/lib/mysql

있는 를 합니다.docker-compose down -v서, 「」는-v볼륨 섹션에 정의된 볼륨을 삭제합니다.https://docs.docker.com/compose/reference/down/ 를 참조해 주세요.다음 번에docker-compose upMySQL 이미지가 새로 시작되고 환경 섹션에서 제공한 구성으로 데이터베이스를 초기화합니다.

질문에 답하는 중...

새 도커 컨테이너를 만들 때 사용하는 작업 중 하나는 빌드 시 이미지에서 가져온 이미지가 무엇을 하는지 이해하는 것입니다.

docker-compose.yml에 이런 게 있어요

# The Database
database:
  image: mysql:5.7

이 이미지는 "mysql:5.7"에서 가져온 이미지입니다.

Dockerhub는 이 이미지의 정보를 찾을 수 있는 저장소입니다.

구글 검색 "mysql:5.7 dockerhub"를 실행합니다.

첫 번째 결과는 https://hub.docker.com/_/mysql/ 입니다.

이미지 5.7이 표시됩니다. 5.7을 클릭하면 다음과 같이 표시됩니다.

https://github.com/docker-library/mysql/blob/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7/Dockerfile

이미지의 Docker 파일입니다.이미지를 빌드할 때 발생하는 흥미로운 일들을 볼 수 있습니다.

그 중 하나가 ENTERPOINT ["docker-entrypoint.sh"]

이미지가 준비되었을 때 실행된 파일입니다.

리포에서 한 단계 위로 올라가면 이 파일을 볼 수 있습니다.

https://github.com/docker-library/mysql/tree/607b2a65aa76adf495730b9f7e6f28f146a9f95f/5.7

환경변수가 새 데이터베이스 작성 등에 사용되는 것을 확인할 수 있습니다.

file_env 'MYSQL_DATABASE'
        if [ "$MYSQL_DATABASE" ]; then
            echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}"
            mysql+=( "$MYSQL_DATABASE" )
fi

공식 MySQL 도커 이미지에서는 기본 이미지에 init 스크립트의 지원이 추가되었습니다.Docker Hub 페이지의 "Initializing a fresh instance"에서 이 기능을 문서화합니다.

MySQL 도커 이미지에서 여러 데이터베이스와 사용자를 만드는 문제를 해결하기 위해 수행한 단계는 다음과 같습니다.

  1. 파일는 . .파일을을 init (Docker " .sh, .sql " .sql.gz " )로 .setup.sql로컬 디렉토리에서.docker
  2. 를 안에 .setup.sql를 참조해 주세요).
  3. .f의 범위 내에서docker-compose.yaml해 주세요)
  4. 실행합니다.docker-compose up -d은 MySQL에서 코드를 합니다.setup.sql

주의: 스크립트는 파일을 알파벳 순으로 실행하므로 유의하십시오.

docker-compose의 예.야무지다

version: "3.5"
services:
    mysql:
        image: mysql
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: SomeRootPassword1!
            MYSQL_USER: someuser
            MYSQL_PASSWORD: Password1!
            MYSQL_DATABASE: somedatabase
        volumes:
            - .docker/setup.sql:/docker-entrypoint-initdb.d/setup.sql
            - db_data:/var/lib/mysql
volumes:
    db_data:

설정 예sql

-- create the databases
CREATE DATABASE IF NOT EXISTS projectone;

-- create the users for each database
CREATE USER 'projectoneuser'@'%' IDENTIFIED BY 'somepassword';
GRANT CREATE, ALTER, INDEX, LOCK TABLES, REFERENCES, UPDATE, DELETE, DROP, SELECT, INSERT ON `projectone`.* TO 'projectoneuser'@'%';

FLUSH PRIVILEGES;

「2」가..yml ★★★★★★★★★★★★★★★★★」.yaml다음과 같이 됩니다.

version: '2'
volumes:
 dbdata:

services:
 mysql:
  image: mysql:5.7
  container_name: mysql
  volumes:
    - dbdata:/var/lib/mysql
  restart: always
  environment:
    - MYSQL_ROOT_PASSWORD=secret
    - MYSQL_DATABASE=homestead
    - MYSQL_USER=root
    - MYSQL_PASSWORD=secret
  ports:
    - "33061:3306"

docker-compose up -d다음 사항을 확인합니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
a3567fb78d0d        mysql:5.7           "docker-entrypoint..."   2 minutes ago       Up 2 minutes        0.0.0.0:33061->3306/tcp   mysql

docker exec -it a3567fb78d0d bash
root@a3567fb78d0d:/# mysql -u root -p homestead
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.17 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

볼륨으로 됩니다.nameoffolder_dbdata )/var/lib/docker/volumes/...)

제가 당신의 질문을 제대로 이해했다면, 당신은 특정 데이터베이스가 들어 있는 컨테이너를 원합니다.를 MySQL과 함께 하세요.CREATE DATABASE mydb 이 이미 실행되어 . 때는 '어울릴 수 없다'를 해야 합니다.docker-entrypoint-initdb.d: https://docs.docker.com/samples/library/mysql/ #docker-displays

공식 MySQL 컨테이너가 처음 시작되면 새 데이터베이스가 먼저 생성됩니다. 다음 . 및 인 파일이 이 파일은 가 .sh, .sql, .sql.gz이다./docker-entrypoint-initdb.d은 '만들기'를 것 뿐입니다/docker-entrypoint-initdb.d디렉토리 및 초기화 스크립트를 저장합니다.

이 설정은 데이터베이스가 이미 존재함을 의미합니다.그렇지 않으면 init 스크립트를 사용하거나 수동으로 작성해야 합니다.

스크립트의 Init 스크립트).sh,.sql ★★★★★★★★★★★★★★★★★」.sql.gz는 파일 내에 있어야 합니다./docker-entrypoint-initdb.d/이치

이 init 스크립트를 볼륨으로 도커 컴포지트 파일에 추가하기만 하면 됩니다.

database:
 image: mysql:latest
  volumes:
    - ./init-script.sql:/docker-entrypoint-initdb.d/init-script.sql

  ...

의 ★★★★★★★★★★★★★★★★★.init-script.sql을 사용하다

CREATE DATABASE IF NOT EXISTS some_name;
USE some_name;

https://hub.docker.com/_/mysql/의 "Initializing a fresh instance"에는 모든 .sql,.sh,.sql.gz 파일을 "/docker-entrypoint-initdb"에 복사하도록 명시되어 있습니다.d" 폴더.아래는 많은 프로젝트에 사용하고 있는 도커 컴포지트 파일로, 최신 버전의 MySQL에서는 정상적으로 동작하고 있습니다.

version: '3.6'
services:   
  mysql:
      environment:
          - MYSQL_DATABASE=root
          - MYSQL_ROOT_PASSWORD=changeme
          - MYSQL_USER=dbuser
          - MYSQL_PASSWORD=changeme
      command: 
         - --table_definition_cache=100
         - --performance_schema=0
         - --default-authentication-plugin=mysql_native_password
         - --innodb_use_native_aio=0
      volumes: 
          - ./init:/docker-entrypoint-initdb.d
      container_name: mysqldb
      image: mysql  

내 init 폴더에는 init이 있습니다.컨테이너가 시작될 때 다시 생성해야 하는 전체 SQL 데이터 덤프가 들어 있는 sql 파일입니다.

다음 명령을 사용하여 MySQL 컨테이너에서 사용되는 메모리를 100MB로 제한합니다.

         - --table_definition_cache=100
         - --performance_schema=0

메모: 데이터를 유지하려면 다음 구성을 사용하십시오.

version: '3.6'
services:   
  mysql:
      environment:
          - MYSQL_DATABASE=root
          - MYSQL_ROOT_PASSWORD=changeme
          - MYSQL_USER=dbuser
          - MYSQL_PASSWORD=changeme
      command: 
         - --table_definition_cache=100
         - --performance_schema=0
         - --default-authentication-plugin=mysql_native_password
         - --innodb_use_native_aio=0
      volumes: 
          - ./init:/docker-entrypoint-initdb.d
          - ./dbdata:/var/lib/mysql
      container_name: mysqldb
      image: mysql  

여기서 dbdata는 호스트 시스템에 생성해야 하는 폴더입니다.

데이터베이스를 작성하는 경우 Docker-compose.yml은 Docker 파일을 사용하는 것처럼 표시됩니다.

version: '3.1'

services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:
  mysql-data:

Docker-compose.yml은 Dockerfile 대신 이미지를 사용하는 것처럼 보입니다.

version: '3.1'   

services:
  php:
    image: php:7.4-apache
    ports:
      - 80:80
    volumes:
      - ./src:/var/www/html/
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
volumes:

mysql의 데이터를 저장 또는 보존하려면 docker-timeout.yml에 두 줄을 추가해야 합니다.

volumes:
  - mysql-data:/var/lib/mysql

그리고.

volumes:
  mysql-data:

그 후 이 명령어를 사용합니다.

docker-compose up -d

이제 데이터는 지속되며 이 명령을 사용해도 삭제되지 않습니다.

docker-compose down

extra:- 단, 모든 데이터를 삭제하려면

docker-compose down -v

Mysql 도커 이미지의 문서

MYSQL_DATABASE 이 변수는 옵션이며 이미지 시작 시 작성할 데이터베이스 이름을 지정할 수 있습니다.사용자/비밀번호가 제공된 경우(아래 참조), 해당 사용자에게 이 데이터베이스에 대한 슈퍼유저 액세스(GRANT ALL에 대응)가 부여됩니다.

따라서 docker-compose.yml 파일에 추가합니다.

    db:
        image: mysql:8.0.29
        environment:
            MYSQL_DATABASE: '[your-database-name]'

언급URL : https://stackoverflow.com/questions/43322033/create-database-on-docker-compose-startup