sourcecode

docker-entrypoint-initdb의 MySQL 스크립트가 실행되지 않음

copyscript 2022. 9. 13. 22:11
반응형

docker-entrypoint-initdb의 MySQL 스크립트가 실행되지 않음

MySQL 컨테이너가 시작될 때 여러 데이터베이스를 작성하려고 합니다.https://github.com/docker-library/mysql/pull/18,에 따르면 스크립트를 마운트 또는 복사할 수 있습니다./docker-entrypoint-initdb.d시작 시 자동으로 실행됩니다.

그러나 스크립트는 전혀 실행되지 않습니다.그런 것 같아요.docker-entrypoint.sh에 파일이 표시되지 않는다./docker-entrypoint-initdb.d디렉토리로 이동합니다.

이것은 나의 도커 파일입니다.

FROM mysql
ADD script.sql /docker-entrypoint-initdb.d/script.sql
RUN chmod -R 775 /docker-entrypoint-initdb.d

ENV MYSQL_ROOT_PASSWORD mypass

이건 내 거야script.sql:

CREATE DATABASE mydb;
CREATE DATABASE mydb2;

컨테이너를 만들고 실행합니다.

$ docker build -t mysql .
$ docker run -v data_volume:/var/lib/mysql --name somedb -d mysql

내가 tty의 컨테이너에 접근했을 때, 나는 그 컨테이너가script.sql에 있습니다./docker-entrypoint-initdb.d그러나 실행되지 않습니다.

나는 본 적이 있다.docker logs -f somedb출력은 가능하지만 에러는 없습니다.

와 함께 시도했습니다..shmaria-db도 시도해봤는데 결과는 똑같아요.

뭐가 문제죠?

컨테이너를 실행하기 전에 클리어해야 합니다.그러면 sql 파일이 실행됩니다.이 볼륨data_volume는 다음 명령을 사용하여 제거할 수 있습니다.docker volume rm data_volume.

문제의 근본 원인은 다음에서 찾을 수 있습니다.docker-entrypoint.shmysql 컨테이너를 실행하면 mysql 디렉토리가 체크됩니다./var/lib/mysql존재여부여디렉토리가 존재하지 않는 경우(처음 실행), SQL 파일이 실행됩니다.

    if [ ! -d "$DATADIR/mysql" ]; then
        //Some other logic here

        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 ;;
                *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
                *)        echo "$0: ignoring $f" ;;
            esac
            echo
        done 

자세한 내용은 Dockerfile 소스를 참조하십시오.

그래서 몇 시간 동안 같은 문제를 안고 있다가 docker-entrypoint.sh을 찾아보기로 했습니다.스크립트는 $DATAD를 체크합니다.IR/mysql(표준 /var/lib/mysql)로, docker-entrypoint-initdb.d를 포함한 datadir가 존재하는 경우 나머지 코드를 건너뜁니다.

그래서 내가 한 일은 간단한 초기화를 한 것이다.sh file을 눌러 데이터디어를 제거한 후 도커를 시작합니다.

docker-timeout.yml:

volumes:
  - ./docker/mysql/scripts:/docker-entrypoint-initdb.d
  - ./mysql_data:/var/lib/mysql

init.sh:

#!/bin/bash
rm -rf mysql_data
docker-compose up --force-recreate

그리고 물론 덧붙인다.-d로.docker-compose예상대로 되는 걸 보면요.

mariadb 이미지(버전: 10.4)에서도 같은 문제가 발생하여 컨테이너를 처음부터 작성할 때 파일이나 디렉토리에서 컨테이너 데이터 볼륨이 비어 있는지 확인하고 해결했습니다.

도커 작성 파일입니다.

mariadb:
이미지: mariadb: 10.4재시작: 삭제되지 않은 경우환경:
MYSQL_ROOT_PASSWORD: *********볼륨:
- ./storage/db:/var/lib/db:rw- ./app/db/SQL:/docker-entrypoint-initdb.d/:rw포트:
(3306:3306/표준)

저는 '.storage/db' 경로가 파일에서 비어 있는지 확인해야 했습니다.디렉토리는 존재해야 하지만 비어 있어야 합니다.

저도 같은 문제가 있었어요.진입점 스크립트를 시작하기 전에 디렉토리 소유자를 변경하여 해결했습니다.도커 파일 예시:

FROM mysql:5.7.17
ADD scripts/init.sql /docker-entrypoint-initdb.d/

RUN chown -R mysql:mysql /docker-entrypoint-initdb.d/

CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]

https://stackoverflow.com/a/67435932/15926221에 의거하여 주십시오.

mysql/mariadb의 env 변수로 "MYSql_USER: root"를 사용하는 경우 루트 사용자가 이미 생성되었기 때문에 이것이 문제의 원인일 수 있습니다.

저도 같은 문제가 있었습니다만, 위의 @Ricky가 제시한 근본 원인은 볼륨이 비어 있지 않기 때문입니다.를 실행했다.docker volume ls하기 위해 내 음량을 한다.docker-compose up물론 볼륨도 있었습니다., 지웠거든요.docker volume rm <volume name>에 있는 를 실행했습니다.docker-entrypoint-initdb.d실행 중이었고 데이터베이스에 데이터를 저장했습니다.도커 컴포지트를 실행하기 전에 볼륨이 존재하지 않는지 확인할 때까지 chmod에 대해 걱정하지 마십시오.그래도 안 될 경우 파일 권한을 가지고 놀아볼 수 있습니다.

내 작업 컨테이너에 있는 허가가 궁금할 경우를 대비해서 다음과 같습니다.

한한의 docker-entrypoint-initdb.d

drwxr-xr-x   1 root root 4.0K Nov 16 01:52 docker-entrypoint-initdb.d

sql 스크립트에 대해서는 다음과 같습니다.

root@f0a4da202f39:/opt/app# ls -lh /docker-entrypoint-initdb.d/
total 12K
-rw-r--r-- 1 root root 12K Nov 15 22:14 Henry.sql

그 행동에 대한 해답은 아니지만 저는 보통 이렇게 해요.

RUN mkdir -p /docker-entrypoint-initdb.d && mv myScript.sql /docker-entrypoint-initdb.d/myScript.sql

당신의 코드에 아무 문제가 없다고 생각하지만 누가 알겠습니까? 775가 정확한 주인인지 확인하셨겠죠?FROM mysql을 사용하는 경우: 5

당신은 그 문제를 해결했나요?

간단한 회피책은 /docker-entrypoint-initdb.d/ 파일을 읽을 때 절대 경로를 사용하는 것입니다.

https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile#L70의 기본 설정을 사용하여 테스트를 수행했습니다.

도커 진입점sh는 실행 전에 먼저 /usr/local/bin으로 이동합니다.

그런 다음 /docker-entrypoint-initdb.d/에 있는 파일을 읽습니다.단, 다음과 같습니다.

for f in /docker-entrypoint-initdb.d/*; do

아무것도 못 찾은 것 같아요

다음으로 대체하면:

for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do

다음 Dockerfile 명령으로 폴더가 채워져 있는지 확인합니다.

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

COPY docker-entrypoint-initdb.d/ /usr/local/bin/docker-entrypoint-initdb.d/
RUN chmod -R +x /usr/local/bin/docker-entrypoint-initdb.d

여기서 /docker-entrypoint-initdb.d/test에 test 문을 작성합니다.sql

CREATE DATABASE `test`;

마지막으로 이미지를 빌드하고 실행하면 데이터베이스가 생성됩니다.

언급URL : https://stackoverflow.com/questions/38504257/mysql-scripts-in-docker-entrypoint-initdb-are-not-executed

반응형