준비된 데이터베이스 체계를 사용하여 docker mysql 컨테이너 만들기


17

내 응용 프로그램에 필요한 체계가 이미 포함 된 mysql 이미지 위에 도커 이미지를 만들고 싶습니다.

Dockerfile에 줄을 추가하여 스키마를 SQL 파일로 가져옵니다. 나는 그렇게했다 (Dockerfile) :

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

내 이해에 따르면, mysql docker 이미지에 mysql 클라이언트가 포함되어 있지 않기 때문에 작동하지 않았습니다 (모범 사례는 "좋아하기 때문에 추가하지 마십시오").

이 작업을 수행하는 좋은 방법은 무엇입니까? 나는 몇 가지 사항을 염두에 두었지만 모두 지저분한 해결책처럼 보입니다.

  1. mysql 클라이언트를 설치하고 관련 작업을 수행 한 다음 제거 / 제거하십시오.
  2. mysql 클라이언트 바이너리를 이미지에 복사하고 내가해야 할 일을 한 다음 제거하십시오.
  3. 다른 SQL Server에서 스키마를 만들고 db 파일을 직접 복사하십시오 (이것은 매우 혼란스럽고 오염 된 문제 풀처럼 들립니다)

어떤 제안? 나중에 유지 관리가 용이하고 모범 사례를 준수 할 수있는 방법으로 희망을 갖고 있습니까?


답변:


14

init 스크립트 /docker-entrypoint-initdb.dMySQL Docker 이미지 문서 의 "새 인스턴스 초기화"섹션으로 마운트 된 디렉토리에 넣어야합니다 .


2
그것은 신선한 컨테이너를 가져 와서 내 스키마와 함께로드하는 데 효과적입니다. 그 주위에 좋은 방법이 있지만 이미 스키마가 미리 설치된 내 독커 이미지 를 만드는 방법을 찾고 있다면 어떻게해야 합니까?
Tom Klino

사실, 신경 쓰지 마라 :-) 나는 /docker-entrypoint-initdb.d호스트에 있다고 생각 했지만 실제로 컨테이너에 있다고 생각했다 . ADD해당 디렉토리로 복사하도록 명령을 변경하고 명령을 제거했습니다 RUN. Docker는 이미지를 성공적으로 빌드하고 테스트했으며 작동합니다.
Tom Klino

14

테스트 목적으로이 작업을 수행해야했습니다.

dockerhub 및 다단계 빌드에서 실제 MySQL / MariaDB 이미지를 활용하여 수행 한 방법은 다음과 같습니다.

FROM mariadb:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]

FROM mariadb:latest

COPY --from=builder /initialized-db /var/lib/mysql

전체 작업 예 : https://github.com/lindycoder/prepopulated-mysql-container-example


2
전체 인터넷에서 찾은 가장 좋은 답변, postgres를위한 것이 었으므로 조금 더 어려웠지만 마침내 작동했습니다. 그리고 그것은 완벽하게 작동합니다!
snowe2010

이전 버전의 mysql (5.7.9)에는 /usr/local/bin/docker-entrypoint.sh가 /entrypoint.sh에 링크되어 있지 않고 대신 /에 entrypoint.sh가 있습니다. /usr/local/bin/docker-entrypoint.sh를 /entrypoint.sh로 변경하면 "현대"릴리스에서도 작동합니다.
마빈

2

@Martin Roy의 크레딧

mysql에서 작동하도록 약간 변경했습니다 ...

컨텐츠 도커 파일

FROM mysql:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

FROM mysql:latest

COPY --from=builder /initialized-db /var/lib/mysql

컨텐츠 setup.sql

CREATE DATABASE myexample;

USE myexample;

CREATE TABLE mytable (myfield VARCHAR(20));

INSERT INTO mytable VALUES ('Hello'), ('Dolly');

전체 작업 예 : https://github.com/iamdvr/prepopulated-mysql-container-example


-1

Ansible과 같은 관리 소프트웨어를 사용하면 클라이언트를 설치하고 다시 설치할 필요없이 mysql 가져 오기를 쉽게 자동화 할 수 있습니다. Ansible에는 docker 이미지와 컨테이너 및 mysql 데이터베이스를 관리하는 뛰어난 내장 기능이 있습니다.


흥미 롭습니다. Ansible을 사용했지만 Docker 이미지에는 사용하지 않았습니다. 몇 가지 예를 들어 대답을 확장 할 수 있습니까, Patrick?
Greg Dubicki

Ansible에는 훌륭한 문서 페이지가 있습니다.이 URL에서 Ansible 모듈을 찾을 수 있습니다. docs.ansible.com/ansible/docker_module.html 이 안내서의 모듈 장에있는 각 페이지에는 몇 가지 예가 있습니다.
Patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.