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
출력은 가능하지만 에러는 없습니다.
와 함께 시도했습니다..sh
maria-db도 시도해봤는데 결과는 똑같아요.
뭐가 문제죠?
컨테이너를 실행하기 전에 클리어해야 합니다.그러면 sql 파일이 실행됩니다.이 볼륨data_volume
는 다음 명령을 사용하여 제거할 수 있습니다.docker volume rm data_volume
.
문제의 근본 원인은 다음에서 찾을 수 있습니다.docker-entrypoint.sh
mysql 컨테이너를 실행하면 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
'sourcecode' 카테고리의 다른 글
템플릿이 없는 컴포넌트 (0) | 2022.09.13 |
---|---|
matplotlib: 이미지에 직사각형을 그리는 방법 (0) | 2022.09.13 |
Panda DataFrame에서 True/False를 1/0에 매핑하려면 어떻게 해야 합니까? (0) | 2022.09.13 |
scheduleAtFixedRate와 스케줄고정 지연 포함 (0) | 2022.09.13 |
Linux Mint에서 MariaDB를 시작할 때 /etc/mysql/debian-start에서 이 오류가 발생하는 이유는 무엇입니까? (0) | 2022.09.13 |