내 사용 사례는 macOS의 docker가 보호된 보안 모델과 일부 HyperVisor 시스템을 사용하기 때문에 sudo 또는 루트 액세스가 필요하지 않다는 것입니다(여기서의 세부 정보는 주제에서 벗어남). 반면 실제 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