source

MySQL 설정 및 Dockerfile 내 덤프 가져오기

factcode 2023. 1. 9. 21:14
반응형

MySQL 설정 및 Dockerfile 내 덤프 가져오기

LAMP 프로젝트의 Docker 파일을 셋업하려고 하는데 MySQL을 시작할 때 몇 가지 문제가 있습니다.도커 파일에 다음 행이 있습니다.

VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql

하지만 계속해서 다음 오류가 발생합니다.

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

Dockerfile 빌드 중에 데이터베이스 작성 및 덤프 Import를 설정하는 방법에 대한 의견이 있습니까?

최신 버전의 mysql 도커 이미지를 사용하면 시작 시 데이터를 Import할 수 있습니다.여기 제 도커 컴포지트.yml가 있습니다.

data:
  build: docker/data/.
mysql:
  image: mysql
  ports:
    - "3307:3306"
  environment:
    MYSQL_ROOT_PASSWORD: 1234
  volumes:
    - ./docker/data:/docker-entrypoint-initdb.d
  volumes_from:
    - data

은 data-dump 아래에 .sql의docker/data도킹 스테이션이 실행되고 있는 폴더를 기준으로 합니다../docker-entrypoint-initdb.d테이컨

이것이 어떻게 동작하는지 알고 싶다면 GitHub에서 그것들을 보세요.데이터 가져오기를 허용하기 위해 이 블록을 추가했습니다.

    echo
    for f in /docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)  echo "$0: running $f"; . "$f" ;;
            *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
            *)     echo "$0: ignoring $f" ;;
        esac
        echo
    done

또한 mysql 컨테이너를 중지하고 삭제한 후에도 데이터를 유지하려면 docker-compose.yml에서 볼 수 있듯이 별도의 데이터 컨테이너가 필요합니다.데이터 컨테이너 Dockerfile의 내용은 매우 간단합니다.

FROM n3ziniuka5/ubuntu-oracle-jdk:14.04-JDK8

VOLUME /var/lib/mysql

CMD ["true"]

지속성을 위해 데이터 컨테이너가 시작 상태일 필요도 없습니다.

★★RUNDockerfile는 다른 레이어에서 실행됩니다(의 매뉴얼 참조).

고객님의 고객명Dockerfile 세 개, 세 개, 세 개, 세 개, 세 개, 세 개, 세 개.RUN입니다.문제는 MySQL 서버가 처음 시작할 때만 시작된다는 것입니다.되고 있지 않기 에 "Da" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" "MySQL" 이라는 연결 오류가 나타납니다.mysql★★★★★★ 。

이 문제를 해결하려면 두 가지 해결책이 있습니다.

1:한줄( 「 」1: 「 」)RUN

RUN /bin/bash -c "/usr/bin/mysqld_safe --skip-grant-tables &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /tmp/dump.sql

해결책 2: 스크립트 사용

한 스크립트를 .init_db.sh:

#!/bin/bash
/usr/bin/mysqld_safe --skip-grant-tables &
sleep 5
mysql -u root -e "CREATE DATABASE mydb"
mysql -u root mydb < /tmp/dump.sql

하다에 추가해 보세요.Dockerfile:

ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

db-dump 폴더에 SQL 덤프를 다운로드하여 마운트했습니다.

mysql:
 image: mysql:5.6
 environment:
   MYSQL_ROOT_PASSWORD: pass
 ports:
   - 3306:3306
 volumes:
   - ./db-dump:/docker-entrypoint-initdb.d

★★★★★★★★★★★★★★★를 실행했을 때,docker-compose upDB를 사용하다

작업용 .v3docker-compose.yml중요한 것은 볼륨 디렉티브입니다.

mysql:
  image: mysql:5.6
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_USER: theusername
    MYSQL_PASSWORD: thepw
    MYSQL_DATABASE: mydb
  volumes:
    - ./data:/docker-entrypoint-initdb.d

에는 내 전화번호부가 있다.docker-compose.yml는 나나 a a a가 있다data"dir"를 .sql은 '우리'요..sql덤프 파일(테이블당)을 지정합니다.

는 그냥 뛰어요.docker-compose up는 자동으로정지 됩니다.데이터는 정지 사이에 자동으로 유지됩니다.새 를 " "흡입"할 수 있습니다..sql이 " " " "docker-compose downdocker-compose up.

있다면mysql를 사용하여 "합니다./docker-entrypoint-initdb.d볼륨을 삭제하지 않고 댓글로 남겨주시면 이 답변을 업데이트 해드리겠습니다.

docker-entrypoint-initdb.d 접근법(@Kues 덕분에)을 사용했는데, 이 경우 .env 파일에서 정의한 파라미터에 따라 DB를 만들고 싶어서 이렇게 했습니다.

1) 먼저 도커 루트 프로젝트 디렉토리에서 이런 .env 파일을 정의합니다.

MYSQL_DATABASE=my_db_name
MYSQL_USER=user_test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
MYSQL_PORT=3306

2) 다음으로 docker-compose.yml 파일을 정의합니다.args 디렉티브를 사용하여 환경변수를 정의하고 .env 파일에서 설정했습니다.

version: '2'
services:
### MySQL Container
    mysql:
        build:
            context: ./mysql
            args:
                - MYSQL_DATABASE=${MYSQL_DATABASE}
                - MYSQL_USER=${MYSQL_USER}
                - MYSQL_PASSWORD=${MYSQL_PASSWORD}
                - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
        ports:
            - "${MYSQL_PORT}:3306"

3) 다음으로 Docker 파일을 포함하는 mysql 폴더를 정의합니다.그래서 도커파일은

FROM mysql:5.7
RUN chown -R mysql:root /var/lib/mysql/

ARG MYSQL_DATABASE
ARG MYSQL_USER
ARG MYSQL_PASSWORD
ARG MYSQL_ROOT_PASSWORD

ENV MYSQL_DATABASE=$MYSQL_DATABASE
ENV MYSQL_USER=$MYSQL_USER
ENV MYSQL_PASSWORD=$MYSQL_PASSWORD
ENV MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD

ADD data.sql /etc/mysql/data.sql
RUN sed -i 's/MYSQL_DATABASE/'$MYSQL_DATABASE'/g' /etc/mysql/data.sql
RUN cp /etc/mysql/data.sql /docker-entrypoint-initdb.d

EXPOSE 3306

4) 이제 mysqldump를 사용하여 db를 덤프하고 데이터를 저장합니다.sql inside mysql 폴더

mysqldump -h <server name> -u<user> -p <db name> > data.sql

파일은 일반적인 sql 덤프 파일이지만 처음에 두 줄을 추가하여 다음과 같이 만듭니다.

--
-- Create a database using `MYSQL_DATABASE` placeholder
--
CREATE DATABASE IF NOT EXISTS `MYSQL_DATABASE`;
USE `MYSQL_DATABASE`;

-- Rest of queries
DROP TABLE IF EXISTS `x`;
CREATE TABLE `x` (..)
LOCK TABLES `x` WRITE;
INSERT INTO `x` VALUES ...;
...
...
...

§ " sed MYSQL_DATABASEMYSql_DATABASE /하여 "RUN sed -i's/MYSQL_DATABASE/$MYSQABASE" 했습니다.MYSQL_DATABASE.파일에.env " " DB " " " " " " " " 。

|- docker-compose.yml
|- .env
|- mysql
     |- Dockerfile
     |- data.sql

이제 컨테이너를 빌드하고 실행할 준비가 되었습니다.

편집: 여기서 질문을 잘못 이해했습니다.다음 답변은 컨테이너 작성 시 sql 명령어를 실행하는 방법을 설명하지만 OP에서 원하는 이미지 작성 시 sql 명령어를 실행하는 방법은 설명하지 않습니다.

가 받아들인 이 마음에 들지 sleep 5이 시간 되어 있다고 하고 있기 한 것 .또한 는 이미합니다.커스텀 mysql./usr/bin/mysqld_safe.

및를 폴더에 했습니다./docker-entrypoint-initdb.d/이것은 분명히 mysql 이미지 프로바이더에 의해 의도된 방법이기 때문에 도커 컨테이너 내에 있습니다.이 폴더 내의 모든 것은 db 데몬이 준비되면 실행되므로 신뢰할 수 있습니다.

다른 답변과 마찬가지로 이에 대한 설명이 없기 때문에 sql 스크립트 외에 bash 스크립트를 해당 폴더에 복사할 수도 있습니다.이것에 의해, 보다 많은 제어가 가능하게 됩니다.

예를 들어 덤프를 Import할 필요가 있었지만 Import할 데이터베이스를 제공하지 않았기 때문에 덤프만으로는 충분하지 않았습니다.그래서 제 경우엔...db_custom_init.sh다음 내용을 포함합니다.

mysql -u root -p$MYSQL_ROOT_PASSWORD -e 'create database my_database_to_import_into'
mysql -u root -p$MYSQL_ROOT_PASSWORD my_database_to_import_into < /home/db_dump.sql

이 도커파일은 이 스크립트를 복사합니다.

FROM mysql/mysql-server:5.5.62
ENV MYSQL_ROOT_PASSWORD=XXXXX
COPY ./db_dump.sql /home/db_dump.sql
COPY ./db_custom_init.sh /docker-entrypoint-initdb.d/

쿠헤스의 답변에 따르면 숙면을 취하지 않았다.

RUN /bin/bash -c "/usr/bin/mysqld_safe --skip-grant-tables &" && \
  while ! mysqladmin ping --silent; do sleep 1; echo "wait 1 second"; done && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /tmp/dump.sql

/docker-entrypoint-initdb.d에 추가된 파일 또는 스크립트는 컨테이너 시작 시 실행됩니다.

Dockerfile에서 mysql 서비스를 사용할 수 있는 SQL 또는 sh 파일을 추가 또는 실행하지 마십시오.mysql 서비스가 아직 시작되지 않았기 때문에 .sh 파일을 추가하는 가장 좋은 방법은 Docker-entrypoint-initdb.d 디렉토리의 /docker-entrypoint-initdb.d 디렉토리에 mysql 서비스를 추가하는 것입니다.

작업 준비

FROM mysql
ADD mysqlcode.sh /docker-entrypoint-initdb.d/mysqlcode.sh
ADD db.sql /home/db.sql
RUN chmod -R 775 /docker-entrypoint-initdb.d
ENV MYSQL_ROOT_PASSWORD mypassword

및 mysql 코드.sh는 mysql 서비스가 활성화되면 몇 가지 명령을 수행합니다.

mysql 코드

#!/bin/bash
mysql -u root -pmypassword --execute "CREATE DATABASE IF NOT EXISTS mydatabase;"
mysql -u root -pmypassword mydatabase < /home/db.sql    

같은 문제가 발생했지만 MySQL 시작 명령을 분리하여 작동시킬 수 있었습니다.

sudo docker build -t MyDB_img -f Dockerfile.dev
sudo docker run --name SomeDB -e MYSQL_ROOT_PASSWORD="WhatEver" -p 3306:3306 -v $(pwd):/app -d MyDB_img

그런 다음 MySQL 스크립트를 실행하기 전에 20초간 sleep 상태로 둡니다.

sudo docker exec -it SomeDB sh -c yourscript.sh

MySQL 서버가 착신 접속 및 스크립트를 받아들이기 전에 부팅하는 데 몇 초 정도 걸릴 것으로 추측됩니다.

언급URL : https://stackoverflow.com/questions/25920029/setting-up-mysql-and-importing-dump-within-dockerfile

반응형