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_A1로, $VAR_B2로 설정해 새 셸 세션을 만들어요. 이 환경 변수는 그 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

더 알아보기