まえがき
Container-Optimized OS(以下COS)上でシェルスクリプトを実行しようとすると、Permission deniedとなり実行できません。
これはシェルスクリプト自体に実行権限がついていても、ディレクトリに実行権限がないからです。
COS上でシェルスクリプトを実行する
COS上でシェルスクリプトを実行する場合は、bashコマンドにスクリプトを渡すと実行できます。
bash ./test.sh
これだけです。簡単ですね😉
bashコマンドを使わずに実行したい場合は、実行権限があるディレクトリにファイルを移動して実行しましょう。
実行権限があるディレクトリは下記リンク先に記述されています。
セキュリティの概要 - ファイルシステム
しかし使えそうなディレクトリは/mnt/disksだけでしょうから、基本的にディスクをマウントしないとシェルスクリプトの実行はできないっぽいですね。
COS自体コンテナを作成して運用する使い方を前提としているため、セキュリティ上シェルスクリプトは実行できないようにしているんでしょうね🙄
docker-composeを別途入れて運用する時は、シェルスクリプトを実行したい場合もあるんですが、私の使い方がおかしいのかも知れません😅
私がつまずいたところ
以下は、COSでシェルスクリプトを実行する際につまずいたことを書いてみました。
スクリプト内で登録したエイリアスコマンドを実行したい
docker-composeが正にそうなんですが、予め登録しておいたコマンドを実行したい時があると思います。
その場合はbashの-iオプションを付けてスクリプトを実行すると、エイリアスコマンドが使えます。
例えばmmコマンドのエイリアスを.bashrcに登録したとします。
alias mm='echo mofumofu'
mmコマンドはecho mofumofuのエイリアスになります。mmコマンドを実行するスクリプトtest.shがあったとして、
#!/bin/bash
mm
これをbashコマンドでオプションを付けずに実行するとcommand not foundになってしまいます。
~ $ bash test.sh
test.sh: line 2: mm: command not found
bashコマンドでエイリアスを使いたい場合は、iオプションを付けて対話形式にしましょう。
~ $ bash -i test.sh
mofumofu
iオプションを付けると対話形式になるため、.bashrcをロードしてからシェルスクリプトが実行されるようになります。
詳しくはGNU_bash
をお読みください。
ssh接続でシェルスクリプトを実行する時に、docker-composeがcommand not foundとなってしまい頭を抱えてしまいましたが、bashコマンドがどういうものか理解すればとても簡単なことでした。
こういう所は壁にぶち当たらないと調べないので、興味を持って勉強することが大切ですね。
同様に困っている人の助けとなれば幸いです。
実行環境
~ $ cat /etc/os-release
NAME="Container-Optimized OS"
ID=cos
PRETTY_NAME="Container-Optimized OS from Google"
HOME_URL="https://cloud.google.com/container-optimized-os/docs"
BUG_REPORT_URL="https://cloud.google.com/container-optimized-os/docs/resources/support-policy#contact_us"
KERNEL_COMMIT_ID=33f8efa193b4c1e0d6823b108db2740999032ca7
GOOGLE_METRICS_PRODUCT_ID=26
GOOGLE_CRASH_ID=Lakitu
VERSION=97
VERSION_ID=97
BUILD_ID=16919.29.9