도커 컨테이너에 스키마가 있는 MySQL 데이터베이스를 초기화하려면 어떻게 해야 합니까?
MySQL 데이터베이스로 컨테이너를 만들고 스키마를 데이터베이스에 추가하려고 합니다.
현재 도커 파일:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
COPY files/epcis_schema.sql /data/epcis_schema.sql
# Change the working directory
WORKDIR data
CMD mysql -u $MYSQL_USER -p $MYSQL_PASSWORD $MYSQL_DATABASE < epcis_schema.sql
컨테이너를 작성하기 위해 도커에 제공된 설명서에 따라 다음 명령을 수행합니다.
docker run --name ${CONTAINER_NAME} -e MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD} -e MYSQL_USER=${DB_USER} -e MYSQL_PASSWORD=${DB_USER_PASSWORD} -e MYSQL_DATABASE=${DB_NAME} -d mvpgomes/epcisdb
, 이 에서는 CMD가 되지 않은 을 확인할 수 Container는 "Container"입니다.실제로 이 명령어는mysql
명령어가 실행됩니다.
어쨌든 스키마를 사용하여 데이터베이스를 초기화하는 방법이 있습니까?아니면 수동으로 이러한 작업을 수행해야 합니까?
MySQL Docker 인스턴스의 스키마를 초기화해야 하는 것과 같은 문제가 있었습니다만, 몇개의 구글링을 실시해, 다른 사람의 예를 따라서 실행한 결과, 이 작업이 어려워졌습니다.내가 해결한 방법은 이렇다.
1) MySQL 스키마를 파일에 덤프합니다.
mysqldump -h <your_mysql_host> -u <user_name> -p --no-data <schema_name> > schema.sql
하여 2) ADD에 스키마 합니다./docker-entrypoint-initdb.d
디렉토리로 이동합니다.docker-entrypoint.sh
은 file로 이 내의 합니다.".sql"
MySQL my my my my my my 。
도커 파일:
FROM mysql:5.7.15
MAINTAINER me
ENV MYSQL_DATABASE=<schema_name> \
MYSQL_ROOT_PASSWORD=<password>
ADD schema.sql /docker-entrypoint-initdb.d
EXPOSE 3306
3) Docker MySQL 인스턴스를 기동합니다.
docker-compose build
docker-compose up
MySQL을 설정하고 Dockerfile 내의 덤프를 Import하여 docker-entrypoint.sh에 대한 정보를 제공하고 SQL과 셸 스크립트를 모두 실행할 수 있게 되었습니다.
이렇게 답변이 길어서 죄송합니다만, 원하는 곳에 가려면 조금 더 가야 합니다.일반적으로 데이터베이스용 스토리지를 데이터베이스 자체와 동일한 컨테이너에 넣는 것이 아니라 데이터가 도커 호스트에 유지되도록 호스트 볼륨을 마운트하거나 컨테이너를 사용하여 데이터를 보관할 수 있습니다(/var/lib/mysql).또한 mysql은 처음이라 매우 효율적이지 않을 수 있습니다.그 말은...
여기에 몇 가지 문제가 있을 수 있습니다.도커파일은 이미지 작성에 사용됩니다.빌드 단계를 실행해야 합니다.적어도 Docker 파일이 포함된 디렉토리에서 다음과 같은 작업을 수행합니다.
docker build .
Dockerfile에는 작성할 이미지가 설명되어 있습니다.mysql에 대해서는 잘 모릅니다만, 「mysql 도커 컨테이너를 초기화하려면 어떻게 해야 합니까」라고 interwebs를 검색했습니다.처음에 작업할 새 디렉토리를 만들고 mdir라고 불렀습니다.다음으로 파일 디렉토리를 만들고 데이터베이스와 단일 테이블을 작성하는 epcis_schema.sql 파일을 저장했습니다.
create database test;
use test;
CREATE TABLE testtab
(
id INTEGER AUTO_INCREMENT,
name TEXT,
PRIMARY KEY (id)
) COMMENT='this is my test table';
그런 다음 파일 디렉토리에 init_db라는 스크립트를 만들었습니다.
#!/bin/bash
# Initialize MySQL database.
# ADD this file into the container via Dockerfile.
# Assuming you specify a VOLUME ["/var/lib/mysql"] or `-v /var/lib/mysql` on the `docker run` command…
# Once built, do e.g. `docker run your_image /path/to/docker-mysql-initialize.sh`
# Again, make sure MySQL is persisting data outside the container for this to have any effect.
set -e
set -x
mysql_install_db
# Start the MySQL daemon in the background.
/usr/sbin/mysqld &
mysql_pid=$!
until mysqladmin ping >/dev/null 2>&1; do
echo -n "."; sleep 0.2
done
# Permit root login without password from outside container.
mysql -e "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '' WITH GRANT OPTION"
# create the default database from the ADDed file.
mysql < /tmp/epcis_schema.sql
# Tell the MySQL daemon to shutdown.
mysqladmin shutdown
# Wait for the MySQL daemon to exit.
wait $mysql_pid
# create a tar file with the database as it currently exists
tar czvf default_mysql.tar.gz /var/lib/mysql
# the tarfile contains the initialized state of the database.
# when the container is started, if the database is empty (/var/lib/mysql)
# then it is unpacked from default_mysql.tar.gz from
# the ENTRYPOINT /tmp/run_db script
(이 스크립트의 대부분은 https://gist.github.com/pda/9697520) 에서 해제되었습니다.
작성한 파일/run_db 스크립트는 다음과 같습니다.
# start db
set -e
set -x
# first, if the /var/lib/mysql directory is empty, unpack it from our predefined db
[ "$(ls -A /var/lib/mysql)" ] && echo "Running with existing database in /var/lib/mysql" || ( echo 'Populate initial db'; tar xpzvf default_mysql.tar.gz )
/usr/sbin/mysqld
마지막으로 모든 파일을 바인드하는 도커 파일:
FROM mysql
MAINTAINER (me) <email>
# Copy the database schema to the /data directory
ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
# init_db will create the default
# database from epcis_schema.sql, then
# stop mysqld, and finally copy the /var/lib/mysql directory
# to default_mysql_db.tar.gz
RUN /tmp/init_db
# run_db starts mysqld, but first it checks
# to see if the /var/lib/mysql directory is empty, if
# it is it is seeded with default_mysql_db.tar.gz before
# the mysql is fired up
ENTRYPOINT "/tmp/run_db"
그래서 mdir 디렉토리(파일 디렉토리와 함께 Docker 파일이 있음)로 CD를 만들었습니다.그런 다음 다음 명령을 실행합니다.
docker build --no-cache .
다음과 같은 출력이 표시됩니다.
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon
Step 0 : FROM mysql
---> 461d07d927e6
Step 1 : MAINTAINER (me) <email>
---> Running in 963e8de55299
---> 2fd67c825c34
Removing intermediate container 963e8de55299
Step 2 : ADD files/run_db files/init_db files/epcis_schema.sql /tmp/
---> 81871189374b
Removing intermediate container 3221afd8695a
Step 3 : RUN /tmp/init_db
---> Running in 8dbdf74b2a79
+ mysql_install_db
2015-03-19 16:40:39 12 [Note] InnoDB: Using atomics to ref count buffer pool pages
...
/var/lib/mysql/ib_logfile0
---> 885ec2f1a7d5
Removing intermediate container 8dbdf74b2a79
Step 4 : ENTRYPOINT "/tmp/run_db"
---> Running in 717ed52ba665
---> 7f6d5215fe8d
Removing intermediate container 717ed52ba665
Successfully built 7f6d5215fe8d
이제 이미지 '7f6d5215fe8d'가 표시됩니다.이 이미지를 실행할 수 있습니다.
docker run -d 7f6d5215fe8d
이미지가 시작되고 인스턴스 문자열이 표시됩니다.
4b377ac7397ff5880bc9218abe6d7eadd49505d50efb5063d6fab796ee157bd3
그 후, 「정지」하고, 재기동할 수 있습니다.
docker stop 4b377
docker start 4b377
로그를 보면 첫 번째 행에는 다음이 포함됩니다.
docker logs 4b377
Populate initial db
var/lib/mysql/
...
그 후 로그의 마지막에 다음과 같이 입력합니다.
Running with existing database in /var/lib/mysql
이것들은 /tmp/run_db 스크립트로부터의 메시지입니다.첫 번째 스크립트는 데이터베이스가 저장된(초기) 버전에서 언팩되었음을 나타내고 두 번째 스크립트는 데이터베이스가 이미 존재했기 때문에 기존 복사가 사용되었음을 나타냅니다.
위에서 설명한 디렉토리 구조의 ls - lR을 다음에 나타냅니다.init_db 및 run_db는 실행 비트가 설정된 스크립트입니다.
gregs-air:~ gfausak$ ls -Rl mdir
total 8
-rw-r--r-- 1 gfausak wheel 534 Mar 19 11:13 Dockerfile
drwxr-xr-x 5 gfausak staff 170 Mar 19 11:24 files
mdir/files:
total 24
-rw-r--r-- 1 gfausak staff 126 Mar 19 11:14 epcis_schema.sql
-rwxr-xr-x 1 gfausak staff 1226 Mar 19 11:16 init_db
-rwxr-xr-x 1 gfausak staff 284 Mar 19 11:23 run_db
이전 서버 응답의 결합을 기반으로 하는 다른 방법:
docker-filename 파일:
version: "3"
services:
db:
container_name: db
image: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=mysql
- MYSQL_DATABASE=db
volumes:
- /home/user/db/mysql/data:/var/lib/mysql
- /home/user/db/mysql/init:/docker-entrypoint-initdb.d/:ro
서 ''는/home/user
는입니다.는 호스트의 공유 폴더입니다.
★★★★★★★★★★★★★★★★★★★★★★★★에/home/user/db/mysql/init
"..." " "SQL" "SQL" "SQL" "SQL" 등 임의의하면 됩니다.init.sql
라이선스:
CREATE DATABASE mydb;
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' IDENTIFIED BY 'mysql';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost' IDENTIFIED BY 'mysql';
USE mydb
CREATE TABLE CONTACTS (
[ ... ]
);
INSERT INTO CONTACTS VALUES ...
[ ... ]
공식 mysql 문서에 따르면 여러 sql 파일을 저장할 수 있습니다.docker-entrypoint-initdb.d
알파벳 이 됩니다.
다른 간단한 방법은 docker-compose를 다음 행과 함께 사용합니다.
mysql:
from: mysql:5.7
volumes:
- ./database:/tmp/database
command: mysqld --init-file="/tmp/database/install_db.sql"
데이터베이스 스키마를 ./database/install_db.sql에 넣습니다.컨테이너를 빌드할 때마다 install_db.sql이 실행됩니다.
Greg의 답변을 시도했지만 전혀 성공하지 못했습니다.모든 단계를 거쳐도 데이터베이스에 데이터가 없었기 때문에 뭔가 잘못된 것이 있었던 것 같습니다.만약을 위해 MariaDB의 최신 이미지를 사용하고 있었습니다.
그런 다음 공식 MariaDB 이미지의 진입점을 읽기로 결정하고 이를 사용하여 간단한 도커 합성 파일을 생성했습니다.
database:
image: mariadb
ports:
- 3306:3306
expose:
- 3306
volumes:
- ./docker/mariadb/data:/var/lib/mysql:rw
- ./database/schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
이제 데이터를 보존하고 나만의 스키마를 사용하여 데이터베이스를 생성할 수 있습니다.
2015년 8월 4일 이후 공식 mysql Docker 이미지를 사용하는 경우 /docker-entrypoint-initdb.d/ 디렉토리에 파일을 추가/복사하기만 하면 컨테이너가 초기화되어 실행됩니다.다른 컨테이너 이미지에 구현하려면 github: https://github.com/docker-library/mysql/commit/14f165596ea8808dfeb2131f092aabe61c967225을 참조하십시오.
가장 쉬운 솔루션은 tutum/mysql을 사용하는 것입니다.
순서 1
docker pull tutum/mysql:5.5
순서 2
docker run -d -p 3306:3306 -v /tmp:/tmp -e STARTUP_SQL="/tmp/to_be_imported.mysql" tutum/mysql:5.5
순서 3
컨테이너 위로 이동_ID 후 명령어 실행docker logs
생성된 비밀번호 정보를 표시합니다.
docker logs #<CONTAINER_ID>
최근 이 문제로 인해 어려움을 겪었기 때문에 도커 컴포지트 파일을 추가하고 있습니다.이 파일은 정말 도움이 됩니다.
version: '3.5'
services:
db:
image: mysql:5.7
container_name: db-container
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- "./scripts/schema.sql:/docker-entrypoint-initdb.d/1.sql"
- "./scripts/data.sql:/docker-entrypoint-initdb.d/2.sql"
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: test
MYSQL_USER: test-user
MYSQL_PASSWORD: password
ports:
- '3306:3306'
healthcheck:
test: "/usr/bin/mysql --user=root --password=password --execute \"SHOW DATABASES;\""
interval: 2s
timeout: 20s
retries: 10
작성만 하면 됩니다.scripts
폴더와 같은 위치에 있습니다.docker-compose.yml
를 참조해 주세요.
그scripts
폴더에는 2개의 파일이 있습니다.
- schema.sql: DDL 스크립트(테이블 작성 등)
- data.sql: 스키마 작성 직후 실행할 문을 삽입합니다.
그 후 다음 명령을 실행하여 이전 데이터베이스 정보를 지울 수 있습니다(새로 시작하기 위해).
docker-compose rm -v -f db && docker-compose up
저처럼 엔트리 포인트스크립트를 작성하지 않으려는 경우 빌드 시 mysqld를 시작하고 다음과 같이 Docker 파일에서 mysql 명령을 실행할 수 있습니다.
RUN mysqld_safe & until mysqladmin ping; do sleep 1; done && \
mysql -e "CREATE DATABASE somedb;" && \
mysql -e "CREATE USER 'someuser'@'localhost' IDENTIFIED BY 'somepassword';" && \
mysql -e "GRANT ALL PRIVILEGES ON somedb.* TO 'someuser'@'localhost';"
또는 미리 채워진 SQL 덤프를 송신합니다.
COPY dump.sql /SQL
RUN mysqld_safe & until mysqladmin ping; do sleep 1; done && \
mysql -e "SOURCE /SQL;"
RUN mysqladmin shutdown
여기서 중요한 것은 mysqld_safe를 싱글로 백그라운드로 전송하는 것입니다.&
서명하다.
이 문제를 해결하려면 명명된 볼륨(db-data)을 사용하여 Docker 파일을 살펴보십시오.마지막 부분에서 플러스라고 선언하는 것이 중요합니다.여기서 제가 말한 볼륨은[external]
이런 식으로 모두 잘 작동했어요!
version: "3"
services:
database:
image: mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- db-data:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=sample
- MYSQL_ROOT_PASSWORD=root
volumes:
db-data:
external: true
다음은 xampp 설치, 스킴으로 MariaDB 작성 및 로컬서버에서 사용되는 정보(usrs, pics orders 등)를 사전에 입력하기 위해 사용한 Docker 파일입니다.
FROM ubuntu:14.04
COPY Ecommerce.sql /root
RUN apt-get update \
&& apt-get install wget -yq \
&& apt-get install nano \
&& wget https://www.apachefriends.org/xampp-files/7.1.11/xampp-linux-x64-7.1.11-0-installer.run \
&& mv xampp-linux-x64-7.1.11-0-installer.run /opt/ \
&& cd /opt/ \
&& chmod +x xampp-linux-x64-7.1.11-0-installer.run \
&& printf 'y\n\y\n\r\n\y\n\r\n' | ./xampp-linux-x64-7.1.11-0-installer.run \
&& cd /opt/lampp/bin \
&& /opt/lampp/lampp start \
&& sleep 5s \
&& ./mysql -uroot -e "CREATE DATABASE Ecommerce" \
&& ./mysql -uroot -D Ecommerce < /root/Ecommerce.sql \
&& cd / \
&& /opt/lampp/lampp reload \
&& mkdir opt/lampp/htdocs/Ecommerce
COPY /Ecommerce /opt/lampp/htdocs/Ecommerce
EXPOSE 80
언급URL : https://stackoverflow.com/questions/29145370/how-can-i-initialize-a-mysql-database-with-schema-in-a-docker-container
'programing' 카테고리의 다른 글
봄철 ContextLoaderListener의 역할/목적 (0) | 2023.01.13 |
---|---|
Python에서의 메타클래스는 무엇입니까? (0) | 2023.01.13 |
Python에서는 5(또는 다른 수)로 반올림 (0) | 2023.01.03 |
쉼표로 구분된 SQL(Maria DB) 문자열을 행으로 분할 (0) | 2023.01.03 |
Axios를 사용하여 Vuex 스토어에서 데이터 검색 (0) | 2023.01.03 |