私の使用例は、macOSのdockerが保護されたセキュリティモデルといくつかのHyperVisorシステムを使用しているため、sudoまたはrootアクセスが必要ないことです(ここの詳細はトピックから離れています)。一方、実際の Linux カーネルと cgroup がある docker では、Linux ベースのシステムでは、docker はコンテナやコマンドを実行するためにアクセスが必要sudo
かアクセス権があります。root
一つ書きたいかなり環境を正しく検出し、sudo
必要に応じてすべてのdockerコマンドを実行するか、不要な場合は実行しない移植可能なスクリプトです。
これを達成するための最良の方法は何ですか?
私の考えの解決策は、docker
スクリプトで直接使用することです。 Linuxユーザーはそれを実行する必要がsudo ./script.sh
あり、macOSユーザーは単に実行できますが、含まれている./script.sh
すべてのコマンドはmkdir、ファイル生成などのルートで実行されます。最もクリーンな方法ではないようです。
私が探しているものの例:
$sudo_or_not docker run -d nginx
$sudo_or_not docker ps | grep nginx
または多分
run_docker_command("docker run -d nginx")
run_docker_command("docker ps | grep nginx")
しかし、bashでこのようなことをする方法がわかりません。すでに$IS_MAC_OS
または0
同じ変数があるので、1
ここではオペレーティングシステムを検出することが重要ではないとします。
ベストアンサー1
Linuxシステムでは、Dockerへのアクセスは通常docker
Dockerソケットへの書き込みアクセス権を持つグループの背後にあります。
% stat /var/run/docker.sock
File: /var/run/docker.sock
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: 17h/23d Inode: 831 Links: 1
Access: (0660/srw-rw----) Uid: ( 0/ root) Gid: ( 999/ docker)
Access: 2019-12-03 15:41:42.633241981 +0900
Modify: 2019-11-28 15:49:03.877925150 +0900
Change: 2019-11-28 15:49:03.877925150 +0900
Birth: -
このグループのメンバーであるユーザーは、コマンドをsudo
実行する必要はありません。docker
ただし、次のようにラッパー関数を使用できます。
if [[ $IS_MAC_OS = 1 ]]
then
sudo_or_not () {
"$@" # just run the arguments
}
else
sudo_or_not () {
sudo "$@" # run the arguments with sudo
}
fi
sudo_or_not docker run foo/bar
または直接包装してみてくださいdocker
。
if [[ $IS_MAC_OS = 1 ]]
then
docker () {
command docker "$@" # just run the actual docker command with arguments
}
else
docker () {
sudo docker "$@" # run docker with sudo
}
fi
docker run foo/bar