DB가 미리 로드된 mysql 이미지 생성

DB가 미리 로드된 mysql 이미지 생성

mysql의 Docker 이미지를 사용하면 mysqldump 스크립트를 특정 폴더에 넣을 수 있으며 처음 시작할 때 해당 스크립트를 사용하여 빈 데이터를 로드합니다.

제가 궁금한 것은 초기 데이터 로드를 기다릴 필요가 없도록 빌드의 일부로 해당 실행이 이미 수행된 이미지를 만드는 방법입니다.

이미지의 목적은 로컬 테스트를 위해 데이터베이스의 개발자 복사본을 보유하는 것입니다.

가능하다면 빌드 서버에 MySQL을 설치하지 않고도 빌드할 수 있도록 다단계 Docker 빌드로 수행하고 싶습니다.

아직 시도하지는 않았지만 일반적인 사고 과정은 다음과 같습니다.

FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh

FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder

그리고 buildscript.sh다음과 같은 일을합니까?

  1. mysqld를 시작하다
  2. mysqld가 완전히 시작될 때까지 기다립니다(??)
  3. 데이터를 구축하는 데 사용된 SQL을 실행합니다.
  4. mysqld를 종료해
  5. 동기화(모든 파일이 기록되었는지 확인)

답변1

진입점에서 작업을 수행하는 대신 Dockerfile에서 작업을 수행하는 것이 가능하다고 생각합니다. 데이터베이스 데이터를 이미지에 복사하고 해당 데이터를 저장한 디렉터리를 가리키도록 my.cnf를 구성하고 덤프 작업을 진입점으로 건너뛰어야 합니다. 어쨌든 개인적으로 이것으로부터 어떤 이점을 얻을 수 있습니까? 즉, 런타임에 데이터베이스를 생성하고 채울 때까지 기다릴 필요는 없지만 이미지를 다시 빌드할 때마다 시간이 걸리고 일부 데이터가 포함되어 있기 때문에 이미지가 더 커지게 됩니다. 이미지를 많이 다시 빌드할 계획이라면 시간 비용이 크게 변하지 않을 것이라는 점을 고려해야 하며, 이미지를 자주 다시 빌드할 계획이 없다면 이점이 있을 수 있습니다.

답변2

현재 작업 솔루션은 다음과 같습니다.

나는Dockerfile

FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh

FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data

build-db.sh그런 다음 기존 세트를 사용하는 세트를 추가합니다.진입점.shexec초기화가 완료되면 마지막 줄을 꺼내서 중지하세요. /data기본값은 /var/lib/mysql빌드의 다음 단계에서 어떤 데이터도 포함하지 않기 때문에 데이터가 입력됩니다 .

#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data

--datadir=/data이를 시작하려면 볼륨이 아닌 디렉터리를 사용해야 합니다 .

관련 정보