docker exec
docker exec
실행 중인 컨테이너 안에서 새 명령을 실행하는 명령이에요. 컨테이너의 기본 프로세스(PID 1)와 별개로, 디버깅이나 관리 목적으로 컨테이너 내부에 명령을 던지고 싶을 때 사용해요.
출처: 문서
본문
docker exec 명령은 실행 중인 컨테이너에서 새 명령을 실행해요.
docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec로 지정한 명령은 컨테이너의 기본 프로세스(PID 1)가 실행 중일 때만 동작해요. 컨테이너가 재시작돼도 이 명령은 다시 실행되지 않아요.
명령은 컨테이너의 기본 작업 디렉터리에서 실행돼요.
명령은 실행 가능한 파일(executable)이어야 해요. 연결(chained)되거나 따옴표로 묶인 명령은 동작하지 않아요.
- 이렇게는 동작해요:
docker exec -it my_container sh -c "echo a && echo b" - 이렇게는 동작하지 않아요:
docker exec -it my_container "echo a && echo b"
실행 중인 컨테이너에서 docker exec 실행하기
먼저 컨테이너를 시작할게요.
$ docker run --name mycontainer -d -i -t alpine /bin/sh
이 명령은 alpine 이미지에서 mycontainer라는 컨테이너를 만들고, sh 셸을 메인 프로세스로 실행하며 시작해요. -d 옵션(--detach의 축약형)은 컨테이너를 데몬 모드로 백그라운드에서 실행하도록 설정하고, -t는 의사 터미널(pseudo-TTY)을 붙여요. -i 옵션은 STDIN을 유지해 sh 프로세스가 바로 종료되지 않게 해요.
그다음 컨테이너에서 명령을 실행할게요.
$ docker exec -d mycontainer touch /tmp/execWorks
이 명령은 백그라운드에서 실행 중인 mycontainer 안에 /tmp/execWorks 파일을 만들어요.
다음으로 컨테이너에서 대화형 sh 셸을 실행할게요.
$ docker exec -it mycontainer sh
이 명령은 mycontainer 컨테이너 안에서 새 셸 세션을 시작해요.
exec 프로세스의 환경 변수 설정 (--env, -e)
docker exec 명령은 컨테이너가 생성될 때 설정된 환경 변수를 상속해요. --env(또는 축약형 -e)를 사용해 전역 환경 변수를 덮어쓰거나, docker exec로 시작한 프로세스에 추가 환경 변수를 설정할 수 있어요.
다음 예제는 mycontainer 컨테이너에서 $VAR_A를 1로, $VAR_B를 2로 설정해 새 셸 세션을 만들어요. 이 환경 변수는 그 docker exec 명령이 시작한 sh 프로세스에만 유효하고, 컨테이너 안에서 실행 중인 다른 프로세스에는 적용되지 않아요.
$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f64a4851eb71
VAR_A=1
VAR_B=2
HOME=/root
컨테이너 권한 상승 (--privileged)
docker run --privileged를 참고해요.
exec 프로세스의 작업 디렉터리 설정 (--workdir, -w)
기본적으로 docker exec 명령은 컨테이너가 생성될 때 설정된 것과 같은 작업 디렉터리에서 실행돼요.
$ docker exec -it mycontainer pwd
/
--workdir 옵션(또는 축약형 -w)으로 명령이 실행될 다른 작업 디렉터리를 지정할 수 있어요.
$ docker exec -it -w /root mycontainer pwd
/root
일시 중지된 컨테이너에서 docker exec 실행 시도
컨테이너가 일시 중지되어 있으면 docker exec 명령은 오류와 함께 실패해요.
$ docker pause mycontainer
mycontainer
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer
$ docker exec mycontainer sh
Error response from daemon: Container mycontainer is paused, unpause the container before exec
$ echo $?
1