title: “Docker entrypoint.sh で Permission denied エラーが出る” date: 2026-01-14 draft: true categories: [“runbook”] tags: [“runbook”, “docker”, “entrypoint”, “permission-denied”, “シェルスクリプト”, “実行権限”] description: “Dockerコンテナ起動時に entrypoint.sh: Permission denied が表示される場合の確認手順と対処方法”

症状

Dockerコンテナ起動時に以下のようなエラーが表示され、コンテナが即座に終了する。

    docker: Error response from daemon: failed to create task for container:
failed to create shim task: OCI runtime create failed:
runc create failed: unable to start container process:
exec: "/entrypoint.sh": permission denied: unknown
  

または

    /bin/sh: /entrypoint.sh: Permission denied
  

結論:まずこれを確認

  1. entrypoint.sh に実行権限があるか確認する
  2. 改行コードが LF になっているか確認する
  3. shebang(#!/bin/bash)が正しいか確認する

トラブルシューティングフロー

    flowchart TD
    A[Permission denied エラー] --> B{ホスト側で実行権限を確認}
    B -->|権限なし| C[chmod +x を実行]
    B -->|権限あり| D{改行コードを確認}
    D -->|CRLF| E[LFに変換する]
    D -->|LF| F{shebangを確認}
    F -->|問題あり| G[shebangを修正]
    F -->|正常| H{Dockerfileを確認}
    H -->|COPY前に権限設定| I[COPYの順序を修正]
    H -->|問題なし| J[コンテナ内で確認]
    C --> K[イメージを再ビルド]
    E --> K
    G --> K
    I --> K
    J --> L[コンテナ内のファイル状態を確認]
  

よくある原因

  1. 実行権限がない - ホスト側で chmod +x されていない
  2. 改行コードが CRLF - Windows環境で作成したファイルに多い
  3. shebang の誤り - #!/bin/bash の記述ミスや不要な空白
  4. Dockerfile の COPY 順序 - 権限設定より先に COPY している
  5. Docker キャッシュ - 古いイメージレイヤーが使われている
  6. ファイルパスの誤り - Dockerfile 内のパス指定が間違っている
  7. ユーザー権限の問題 - コンテナ内で非root実行時に権限が不足

確認手順

ステップ1: ホスト側で実行権限を確認する

    ls -la entrypoint.sh
  

🔍 チェックポイント: 出力の左側に x(実行権限)が含まれているか確認

    -rwxr-xr-x 1 user group 1234 Jan 14 10:00 entrypoint.sh  # OK
-rw-r--r-- 1 user group 1234 Jan 14 10:00 entrypoint.sh  # NG(実行権限なし)
  

権限がない場合:

    chmod +x entrypoint.sh
  

ステップ2: 改行コードを確認する

    file entrypoint.sh
  

🔍 チェックポイント: CRLF が含まれていないか確認

    entrypoint.sh: Bourne-Again shell script, ASCII text executable  # OK
entrypoint.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators  # NG
  

CRLF の場合、LF に変換する:

    # sed を使う方法
sed -i 's/\r$//' entrypoint.sh

# dos2unix を使う方法(インストールが必要な場合あり)
dos2unix entrypoint.sh
  

ステップ3: shebang を確認する

    head -1 entrypoint.sh | cat -A
  

🔍 チェックポイント: 先頭行が #!/bin/bash$ または #!/bin/sh$ で終わるか確認

    #!/bin/bash$     # OK
#!/bin/bash^M$   # NG(CRLFが混入)
 #!/bin/bash$    # NG(先頭に空白)
  

ステップ4: Dockerfile の COPY と権限設定を確認する

    # NG例:COPY後に権限がない
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

# OK例1:ホスト側で事前にchmod +xしておく
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

# OK例2:COPY --chmod を使う(BuildKit必須)
COPY --chmod=755 entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
  

🔍 チェックポイント: COPY 後に RUN chmod +x があるか、または --chmod オプションを使っているか確認

ステップ5: キャッシュなしで再ビルドする

    docker build --no-cache -t myimage .
  

🔍 チェックポイント: 再ビルド後にエラーが解消するか確認

ステップ6: コンテナ内のファイル状態を確認する

ENTRYPOINT を一時的に無効化してコンテナに入る:

    docker run --rm -it --entrypoint /bin/sh myimage
  

コンテナ内で確認:

    ls -la /entrypoint.sh
cat -A /entrypoint.sh | head -3
  

🔍 チェックポイント: コンテナ内でも実行権限と改行コードを確認


NG行動

  • 権限を 777 にする - セキュリティリスクになる。755 で十分
  • エラーを無視して bash /entrypoint.sh で回避 - 根本原因を放置することになる
  • Dockerfile を変更せずホスト側だけ修正 - CI/CD環境や他の開発者の環境で再発する
  • .gitattributes を設定せずにWindowsで編集 - コミットのたびにCRLF問題が再発する

よくある質問(FAQ)

Q1: Windows環境で開発している場合、どうすれば改行コード問題を防げる?

A: リポジトリに .gitattributes を追加する:

    *.sh text eol=lf
entrypoint.sh text eol=lf
  

また、エディタの設定で改行コードを LF に固定する。

Q2: COPY --chmod=755 が効かない場合は?

A: BuildKit が有効になっているか確認する:

    DOCKER_BUILDKIT=1 docker build -t myimage .
  

または docker buildx build を使用する。

Q3: Alpine ベースのイメージで #!/bin/bash が動かない場合は?

A: Alpine には bash がデフォルトで入っていない。#!/bin/sh を使うか、Dockerfile で apk add bash する:

    RUN apk add --no-cache bash
  

関連するエラー・症状


解決しない場合

  • Docker公式ドキュメント: Dockerfile ENTRYPOINT
  • 確認すべきログ: docker logs <container_id>
  • 次に調べるキーワード: exec format errorOCI runtime create failedshim task failed