fastAPI 도커 컨테이너를 만들었고 1개의 명령을 제외하고는 잘 실행됩니다...
일부 이벤트가 발생할 때 다른 도커 컨테이너를 다시 시작해야 합니다.
docker를 실행하는 서버 [호스트]가 있고, docker는 컨테이너A(fastAPI) 및 컨테이너B를 실행하고 있습니다.
호스트가 이 명령을 실행하도록 하는 명령을 컨테이너A에서 실행하도록 하려면 어떻게 해야 합니까?
도커 재시작 컨테이너B
호스트 운영 체제는 Linux입니다.
Python의 subprocess.run()을 사용해 보았지만 물론 작동하지 않습니다. ContainerA에는 docker가 설치되어 있지 않으므로 docker 명령이 없습니다.
Unix 소켓 설치가 작동한다는 기사를 읽었으며 '/var/run/docker.sock:/var/run/docker.sock' 설치를 시도했지만 작동하지 않았습니다.
어떻게 작동하는지 아시면 정말 감사하겠습니다.
감사해요.
답변1
/var/run/docker.sock
편안함을 느끼는 한 일반적인 접근 방식은 컨테이너 내부에 설치하는 것입니다.호스트의 Docker 데몬을 컨테이너에 노출. 이렇게 하려면 컨테이너 내부에서 Docker 클라이언트 바이너리( )를 사용할 수 있는지도 확인해야 합니다. docker
그렇지 않은 경우 이를 이미지에 추가해야 합니다.
답변2
디렉터리에 탑재한 다음 호스트와 컨테이너 사이의 탑재에 파일을 만들고 호스트에서 이 디렉터리에 대한 변경 사항을 확인한 다음 Docker 컨테이너를 다시 시작하는 것이 더 나은 설계입니다.
평소와 같이 호스트에서 마운트를 바인딩합니다.
docker run ... -v /host/path:/container/path:rw
호스트 시스템에서 디렉터리를 확인합니다.
while true; do
if test -e "$dir/test"; then
docker restart containerX
rm -f "$dir/test"
fi
sleep 1
done
컨테이너에서:
touch "$dir/test"
컨테이너 내에서 docker 명령을 실행하기 위해 docker 소켓을 공유하는 것이 기술적으로 가능하더라도 docker 전문가들은 보안상의 이유로 그렇게 하지 말 것을 권고합니다.
DooD 및 DinD에 대해 알아보기podman
, 이 방법을 고집한다면 보안에 더 나을 수도 있습니다. podman
이와 같이 실행되는 루트 서비스는 없습니다 docker
.