도커 컴포지트 시작 시 데이터베이스 작성
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 도커 이미지에서 여러 데이터베이스와 사용자를 만드는 문제를 해결하기 위해 수행한 단계는 다음과 같습니다.
- 파일는 . .파일을을 init (Docker " .sh, .sql " .sql.gz " )로 .
setup.sql로컬 디렉토리에서.docker - 를 안에 .
setup.sql를 참조해 주세요). - .
f의 범위 내에서docker-compose.yaml해 주세요) - 실행합니다.
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
'programing' 카테고리의 다른 글
| Eclipse를 실행하려면 JRE 또는 JDK를 사용할 수 있어야 합니다.다음 위치를 검색해도 JVM을 찾을 수 없습니다. (0) | 2022.11.20 |
|---|---|
| mariadb 아래에 tokudb를 설치하는 중, 플러그를 찾을 수 없습니다. (0) | 2022.11.20 |
| 구분된 문자열에서 후행 구분 문자 제거 (0) | 2022.11.20 |
| mariadb "too many connections" 오류가 발생하여 웹 사이트가 다운되었습니다. (0) | 2022.11.20 |
| MySQL에서 공백이 있는 열 이름을 선택하는 방법 (0) | 2022.11.11 |