Docker for Mac의 gRPC FSE는 유효하고 MySQL의/entrypoint는 유효합니다.sh 에서 오류 발생
15536 단어 DockerDocker Desktoptech
2.4.0.0
로 업데이트한 후 갑자기 MySQL의 컨테이너를 초기화하는 동안/entrypoint.sh
에 오류가 발생하여 기록했습니다.2010/11/03 추기:
2020/11/02
발표된 2.5.0.0
에서도 수정되지 않은 것으로 확인됐습니다...2021/02/04 추기:
2020/01/14
발행된 3.1.0
에서도 수정되지 않은 것으로 확인됐다...빠른 솔루션 (\63;)
다음은 필자가 겪은 사례의 소개이다.
이 보도는 현상과 해결 방법의 소개이다.직접적인 원인은 확인되지 않았으니 양해부탁드립니다.
컨디션
Key
Value
Mac OS X
10.15.7
Docker
19.03.13
Docker Desktop
2.40.0.0 이후
디테일
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.7
BuildVersion: 19H2
$ docker version Client: Docker Engine - Community
Cloud integration 0.1.18
Version: 19.03.13
API version: 1.40
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 16:58:31 2020
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.13
API version: 1.40 (minimum version 1.12)
Go version: go1.13.15
Git commit: 4484c46d9d
Built: Wed Sep 16 17:07:04 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.3.7
GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
현상.
차리다
일부러 하우징을 통해 간단한 SQL 문장을 실행하지만 실제로는 다른 처리도 끼워 넣는다.
시도해 보았지만 SQL을 직접 실행할 때 이 오류가 발생하지 않았습니다.
.
└── docker-entrypoint-initdb.d
├── entry.sh
└── files
└── create_db.sql
docker-entrypoint-initdb.d/entry.sh #!/bin/bash
docker_process_sql < /tmp/files/create_db.sql
docker-entrypoint-initdb.d/files/create_db.sql CREATE SCHEMA IF NOT EXISTS `sample`;
USE `sample`;
CREATE TABLE IF NOT EXISTS `user` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;
MySQL 컨테이너 시작
그래서 신비로운
Permission denied
이 발생했다.또 유무음량
:ro
옵션에는 별다른 변화가 없었다.$ docker run --rm \
-v $(PWD)/docker-entrypoint-initdb.d/entry.sh:/docker-entrypoint-initdb.d/entry.sh:ro \
-v $(PWD)/docker-entrypoint-initdb.d/files:/tmp/files:ro \
-e MYSQL_ROOT_PASSWORD=password \
mysql:latest
(略)
[Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/entry.sh
/usr/local/bin/docker-entrypoint.sh: /docker-entrypoint-initdb.d/entry.sh: /bin/bash: bad interpreter: Permission denied
경미한 조사
"
bad interpreter
아까 계속 움직였잖아..."Permission denied
우선 확인 권한이 있기 때문이다.문제 없어요.# コンテナ内
$ ls -l /tmp/files
total 4
-rw-r--r-- 1 root root 198 Oct 2 17:11 create_db.sql
$ ls -l /docker-entrypoint-initdb.d
total 4
-rw-r--r-- 1 root root 59 Oct 2 17:11 entry.sh
# そんなはずないと思いつつ一応...
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
파일 권한 실행 변경
용기에서 변경 권한을 꺼내면 다시 실행합니다.변경 오류.
조개를 집행할 수 있지만 찾을 수 없다
docker_process_sql
.$ chmod -R 777 docker-entrypoint-initdb.d
$ docker run --rm \
-v $(PWD)/docker-entrypoint-initdb.d/entry.sh:/docker-entrypoint-initdb.d/entry.sh:ro \
-v $(PWD)/docker-entrypoint-initdb.d/files:/tmp/files:ro \
-e MYSQL_ROOT_PASSWORD=password \
mysql:latest
(略)
[Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/entry.sh
/docker-entrypoint-initdb.d/entry.sh: line 3: docker_process_sql: command not found
권한 확인.문제 없어요.# コンテナ内
$ ls -l /tmp/files
total 4
-rwxrwxrwx 1 root root 198 Oct 2 17:11 create_db.sql
$ ls -l /docker-entrypoint-initdb.d
total 4
-rwxrwxrwx 1 root root 59 Oct 2 17:11 entry.sh
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
조금 더 깊이 들어가.
실제 오류가 발생한 부분의 원본 코드를 봐라.
다음은 함수의 코드입니다.
docker_process_init_files()
docker_process_init_files() {
# mysql here for backwards compatibility "${mysql[@]}"
mysql=( docker_process_sql )
echo
local f
for f; do
case "$f" in
*.sh)
# https://github.com/docker-library/postgres/issues/450#issuecomment-393167936
# https://github.com/docker-library/postgres/pull/452
if [ -x "$f" ]; then
mysql_note "$0: running $f"
"$f"
else
mysql_note "$0: sourcing $f"
. "$f"
fi
;;
*.sql) mysql_note "$0: running $f"; docker_process_sql < "$f"; echo ;;
*.sql.gz) mysql_note "$0: running $f"; gunzip -c "$f" | docker_process_sql; echo ;;
*.sql.xz) mysql_note "$0: running $f"; xzcat "$f" | docker_process_sql; echo ;;
*) mysql_warn "$0: ignoring $f" ;;
esac
echo
done
}
이렇게 하면 아래의 불분명한 점을 볼 수 있다.그러나 실제 근무환경에 영향을 미치지 않기 때문에 이상의 조사를 포기했다.if [ -x "$f" ]; ...
에서 실행 권한을 검사했지만 첫 번째 실행 중... running ...
의 로그644
와는 무관합니다.gRPC FUSE를 무효화하고 실행하면 로그가 ... sourcing ...
로 바뀝니다최후
2.4.0.0
이후그리고 여러가지 고통들...Linux와 Docker의 파일 시스템이 상세하지 않아서 큰 누락이 있을 수 있습니다.만약 무슨 문제가 있으면 지적해 주십시오.
참조 링크
현상은 다르지만 마찬가지로 gRPC FUSE가 유효할 때의 불량 사례이다
Reference
이 문제에 관하여(Docker for Mac의 gRPC FSE는 유효하고 MySQL의/entrypoint는 유효합니다.sh 에서 오류 발생), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mythrnr/articles/f01c5bb2596b31b91ae1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)