docker container exec

docker container exec

docker container exec는 실행 중인 컨테이너에서 명령을 실행하는 명령이에요. 실행 중인 컨테이너에 셸을 띄우고 싶을 때 사용해요.

출처: 문서

본문

docker container exec는 실행 중인 컨테이너 안에서 명령을 실행해요. 대화형 셸은 -it 옵션으로 열 수 있고, 작업 디렉터리·환경 변수 등도 지정할 수 있어요.

지원하는 옵션은 다음과 같아요.

옵션 기본값 설명
-d, --detach 백그라운드(detached) 모드로 실행해요
--detach-keys 컨테이너에서 분리하기 위한 키 시퀀스를 덮어써요
-e, --env 환경 변수를 설정해요
--env-file 환경 변수 파일을 읽어요
-i, --interactive STDIN을 유지해요
--privileged 컨테이너에 확장 권한을 부여해요
-t, --tty 의사-TTY를 할당해요
-u, --user 사용자 이름 또는 UID를 정해요
-w, --workdir 컨테이너 안 작업 디렉터리를 정해요

실행 중인 컨테이너에서 docker exec 실행하기

먼저 컨테이너를 시작해요.

$ docker run --name mycontainer -d -i -t alpine /bin/sh

이 명령은 alpine 이미지에서 mycontainer라는 컨테이너를 만들고, sh 셸을 메인 프로세스로 시작해요. -d 옵션(즉 --detach)은 컨테이너를 백그라운드 detached 모드로, 의사-TTY를 연결한(-t) 상태로 실행하게 해요. -i 옵션은 STDIN을 연결 상태로 유지해(-i) sh 프로세스가 바로 종료되지 않게 해요.

다음으로 컨테이너에서 명령을 실행해요.

$ docker exec -d mycontainer touch /tmp/execWorks

이 명령은 실행 중인 컨테이너 mycontainer 안에 /tmp/execWorks 파일을 백그라운드에서 새로 만들어요.

다음으로 컨테이너에서 대화형 sh 셸을 실행해요.

$ docker exec -it mycontainer sh

이 명령은 컨테이너 mycontainer에서 새 셸 세션을 시작해요.

exec 프로세스의 환경 변수 설정 (--env, -e)

먼저 현재 bash 세션에서 환경 변수를 설정해요.

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 실행 시도

컨테이너가 일시 중지(paused)돼 있으면 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

더 알아보기