Docker for Mac의 gRPC FSE는 유효하고 MySQL의/entrypoint는 유효합니다.sh 에서 오류 발생

Docker Desktop for Mac를 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;)

  • gRPC FSE를 무효화하고 Docker Desktop
  • 을 다시 시작합니다.
    다음은 필자가 겪은 사례의 소개이다.
    이 보도는 현상과 해결 방법의 소개이다.직접적인 원인은 확인되지 않았으니 양해부탁드립니다.

    컨디션


    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
    

    조금 더 깊이 들어가.


    실제 오류가 발생한 부분의 원본 코드를 봐라.
    https://github.com/docker-library/mysql/blob/285fd39122/8.0/docker-entrypoint.sh#L65
    다음은 함수의 코드입니다.
    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가 유효할 때의 불량 사례이다
    https://stackoverflow.com/questions/64146845/mysql-not-starting-in-a-docker-container-on-macos-after-docker-update

    좋은 웹페이지 즐겨찾기