Dockerコンテナ起動エラー「failed to create shim task: OCI runtime create failed: runc create failed」の解決方法
問題の概要
Dockerコンテナを起動しようとすると、以下のようなエラーが発生することがあります:
ERROR: for backend-marketplace_backend_1 Cannot start service backend: failed to create shim task:
OCI runtime create failed: runc create failed: unable to start container process: error during container init:
error mounting "/var/lib/docker/volumes/3ceff6572cda1981f7d29faf09f888cb9a8c0c5ac41b10bb323eb5d14e7e1d35/_data"
to rootfs at "/app/node_modules": mkdir /var/lib/docker/overlay2/c0a5b761bb9a94bb9a4dd3c21a862968dbbabe87698c0f744569ea56e323ea0e/merged/app/node_modules:
read-only file system: unknown
このエラーは、Linux環境でDockerを使用している際に特に発生しやすく、ファイルシステムのパーミッション問題やリソース制限、コンテナ設定の誤りなど様々な原因が考えられます。
エラーの意味
「read-only file system」というメッセージから、コンテナが書き込み権限が必要な操作を実行しようとしているが、ファイルシステムが読み取り専用になっていることがわかります。
主な解決方法
1. ファイルパーミッションの修正(最も一般的な解決策)
Linux環境では、ファイルやディレクトリの所有権とパーミッションが重要な役割を果たします。Dockerfileに以下の行を追加することで解決できる場合があります:
FROM node:16-alpine
ENV NODE_ENV="development"
WORKDIR /app
COPY package.json .
COPY package-lock.json .
ARG NODE_ENV
RUN apk add g++ make py3-pip
RUN npm install
# 権限設定を追加
RUN chown -R node /app/node_modules
RUN npm install -g ts-node nodemon
COPY . ./
ENV PORT 8000
EXPOSE $PORT
CMD ["ts-node", "./src/server.ts"]
RUN chown -R node /app/node_modules
という行を追加することで、node_modulesディレクトリの所有権を適切に設定し、コンテナ内での書き込み操作を可能にします。
2. 実行権限の付与
スクリプトファイルや実行ファイルに対して実行権限がない場合も同様のエラーが発生します。以下のようにchmodコマンドで権限を付与します:
RUN chmod +x ./src/server.ts
3. コンテナの再作成
コンテナが何らかの理由で破損している場合、一度完全に削除してから再作成することで解決することがあります:
# コンテナの停止と削除
docker-compose down
# 関連するリソースのクリーンアップ
docker system prune
# 再度起動
docker-compose up -d --build
TIP
docker system prune
コマンドは、停止中のコンテナ、未使用のネットワーク、ぶら下がったイメージ、ぶら下がったビルドキャッシュを削除します。重要なリソースまで削除される可能性があるため、必要なものはバックアップを取ってから実行してください。
4. Docker Composeのタイムアウト設定の調整
大規模なプロジェクトでは、ビルド時間が長くなりタイムアウトする場合があります。環境変数でタイムアウト時間を延長します:
# タイムアウトを480秒に設定
export COMPOSE_HTTP_TIMEOUT=480
docker-compose up -d --build
5. リソース制限の調整
Kubernetes環境などでは、リソース要求がノードの能力を超えている場合にこのエラーが発生することがあります。deployment.ymlなどのリソース設定を調整します:
# 問題のある設定例
resources:
limits:
cpu: "1024Mi" # 誤った形式(Miはメモリ単位)
memory: "2024Mi"
requests:
cpu: "600m"
memory: "1024Mi"
# 修正後の設定例
resources:
limits:
cpu: "600m" # 正しいCPU設定
memory: "1024Mi"
requests:
cpu: "100m"
memory: "500Mi"
注意
CPUリソースの指定では、メモリ単位(Mi)を使用できません。CPUの場合はミリコア(m)またはコア数で指定する必要があります。
6. エントリポイントの修正
Alpine Linuxなどの軽量イメージでは、デフォルトのシェルが異なる場合があります。スクリプトを実行する際は明示的にシェルを指定します:
# /bin/sh を使用
ENTRYPOINT ["/bin/sh", "/my-script.sh"]
# または /bin/bash を使用
ENTRYPOINT ["/bin/bash", "/my-script.sh"]
7. 実行コマンドのパス確認
Pythonなどの実行ファイルのパスが正しいか確認します。環境によってはpython
ではなくpython3
を使用する必要があります:
# 変更前
command: python manage.py runserver 0.0.0.0:8000
# 変更後
command: python3 manage.py runserver 0.0.0.0:8000
予防策
- 定期的なクリーンアップ: 未使用のDockerリソースを定期的に削除する
- 適切なリソース計画: コンテナのリソース要求を見積もり、適切に設定する
- パーミッションの意識: Dockerfile内で適切な所有権とパーミッションを設定する
- ログの確認: エラー発生時には詳細なログを確認し、根本原因を特定する
まとめ
「failed to create shim task: OCI runtime create failed」エラーは様々な原因で発生しますが、最も一般的なのはファイルシステムのパーミッション問題です。Linux環境ではchown
やchmod
で適切な権限を設定することが重要です。また、コンテナの破損やリソース不足が原因の場合もあるため、状況に応じて適切な対処法を選択してください。
トラブルシューティングのヒント
docker logs <コンテナ名>
で詳細なエラーログを確認docker system df
でDockerのディスク使用状況を確認- 問題が解決しない場合は、DockerのバージョンやOS環境を確認
これらの解決策を試しても問題が解決しない場合は、DockerのバージョンやホストOSの環境など、より詳細な情報とともにコミュニティで質問することをおすすめします。