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_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 실행 시도
컨테이너가 일시 중지(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