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
結論:まずこれを確認
- entrypoint.sh に実行権限があるか確認する
- 改行コードが LF になっているか確認する
- 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[コンテナ内のファイル状態を確認]
よくある原因
- 実行権限がない - ホスト側で
chmod +xされていない - 改行コードが CRLF - Windows環境で作成したファイルに多い
- shebang の誤り -
#!/bin/bashの記述ミスや不要な空白 - Dockerfile の COPY 順序 - 権限設定より先に COPY している
- Docker キャッシュ - 古いイメージレイヤーが使われている
- ファイルパスの誤り - Dockerfile 内のパス指定が間違っている
- ユーザー権限の問題 - コンテナ内で非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 error、OCI runtime create failed、shim task failed