エラー概要
docker-compose.yaml
のcommand
セクションからスクリプト実行するときに、以下のエラーに遭遇しました。
こちらの原因と解決方法を記載します。
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.yaml
のcommand
セクションは、コンテナが起動するときに実行されるデフォルトのコマンドが指定できます。
ここでスクリプトを起動する際に、実行権限がなくてエラーを吐いていたのです。
## 略 ##
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.yaml
のcommand
セクションは以下のように複数書くと、後に指定されたものが優先されます。
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
してるだけですが、このように複数のコマンドを実行させることもできます。
#!/bin/bash
echo "Hi, this is sample command"
# Djangoのサーバーを起動
python manage.py runserver 0.0.0.0:8000
# そのほか以下に書く