0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Docker】docker-composeでスクリプト実行したら`OCI runtime create failed...permission denied`となった場合

Posted at

エラー概要

docker-compose.yamlcommandセクションからスクリプト実行するときに、以下のエラーに遭遇しました。
こちらの原因と解決方法を記載します。

Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "./sample-script.sh": permission denied: unknown

原因

上記エラーは、sample-script.shスクリプトに実行権限がないために発生するエラー。
ls -laでパーミッションを確認。

-rw-r--r--  1 xxxxxxx  staff   33  1 15 18:09 sample-script.sh

-rw-r--r--は、ファイルのパーミッションを表すための記号表現ですね。
数値に直すと644になります。実行(x)権限がないのがわかりますね。

このスクリプトに実行権限を付与してあげる必要があります。

ちなみにdocker-compose.yamlcommandセクションは、コンテナが起動するときに実行されるデフォルトのコマンドが指定できます。
ここでスクリプトを起動する際に、実行権限がなくてエラーを吐いていたのです。

docker-compose.yaml
## 略 ## 
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: ["./sample-script.sh""] ## 実行権限がないスクリプトを実行させようとしている
    volumes:
      - ./myprojects:/code 
    ports:
      - "8000:8000"
   ## 略 ## 

解決方法

以下コマンドにより、スクリプトに現在のユーザーに対する実行権限を付与できます。

chmod +x sample-script.sh

+x」が「実行権限を追加する」という意味になります。
この後に、ls -laで確認すると以下になりました。

-rwxr-xr-x  1 xxxxxxx  staff   33  1 15 18:09 sample-script.sh*

-rwxr-xr-xは、ファイルのパーミッションを表すための記号表現ですね。
これを数値で表すと「755」になりますので、chmod 755とかでもいけますね。

イメージを再度ビルドしてコンテナを立ち上げると、無事にスクリプトが走ったことを確認できました。

補足:commandセクションの扱いについて

ちなみに、docker-compose.yamlcommandセクションは以下のように複数書くと、後に指定されたものが優先されます。

  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: ["./sample-script.sh"]
    command: python manage.py runserver 0.0.0.0:8000 # こちらだけ実行される

以下のようにしても、スクリプトが終了するとコンテナも終了してしまうので後の方は実行されません(コンテナ内のコマンドは非同期的に実行されるため)。

  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: ["./sample-script.sh", "python", "manage.py", "runserver", "0.0.0.0:8000"]

複数使いたい場合は、それこそこのようなスクリプトファイルを使って、その中に実行したいコマンドを記載してあげると良いです。
以下はechoしてるだけですが、このように複数のコマンドを実行させることもできます。

sample-script.sh
#!/bin/bash

echo "Hi, this is sample command"

# Djangoのサーバーを起動
python manage.py runserver 0.0.0.0:8000

# そのほか以下に書く
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?