HOWTO · Docker
Docker에서 작업 디렉토리 명령 변경
이 기사에서는 Docker에서 작업 디렉토리를 변경하는 방법에 대해 설명합니다.
이 페이지의 내용
Dockerfile에서 WORKDIR을 사용하면 이후 빌드 명령의 작업 디렉터리와 이미지의 기본 작업 디렉터리를 설정할 수 있습니다. 새 컨테이너 프로세스를 시작할 때는 docker run -w /app을 사용하고, 실행 중인 컨테이너에서 명령을 실행할 때는 docker exec -w /app을 사용합니다. 대화형으로 이동하려면 docker exec으로 셸을 시작한 다음 그 안에서 cd를 실행하세요. 각 방법은 적용되는 단계와 범위가 다르므로, 한 프로세스나 셸에서 디렉터리를 바꿔도 컨테이너의 모든 프로세스가 바뀌지는 않습니다.
Docker 작업 디렉터리 이해하기
작업 디렉터리는 프로세스가 상대 경로를 기준으로 삼는 시작 위치입니다. 이미지가 자체 작업 디렉터리를 지정할 수 있으므로 컨테이너가 항상 /에서 시작한다고 가정하지 마세요. WORKDIR은 이미지 구성에 디렉터리를 설정하고 이후 Dockerfile 명령에도 적용됩니다. 컨테이너를 실행할 때는 docker run -w로 해당 실행에 사용할 다른 디렉터리를 선택할 수 있습니다. docker exec -w는 실행 중인 컨테이너에서 새로 시작하는 명령의 작업 디렉터리를 선택합니다.
디렉터리를 적용할 시점에 맞는 방법을 선택하세요. 이미지 빌드 중인지, 컨테이너를 시작할 때인지, 나중에 시작하는 명령이나 셸에 적용할지에 따라 방법이 달라집니다. 셸에서 실행하는 cd는 해당 셸의 현재 디렉터리만 바꿉니다. 다른 프로세스의 작업 디렉터리를 바꾸거나 컨테이너 전체의 상태를 설정하지는 않습니다.
Dockerfile에서 작업 디렉터리 설정하기
Dockerfile에서 /app을 사용할 명령 앞에 WORKDIR /app을 작성하세요. 예를 들어 명령 순서는 FROM ubuntu:24.04, WORKDIR /app, COPY . ., RUN make로 구성할 수 있습니다. 이는 셸 스크립트가 아니라 Dockerfile 문법입니다. 뒤따르는 COPY와 RUN 명령은 작업 디렉터리로 /app을 사용합니다. 경로가 없으면 Docker가 만듭니다. 이후에 WORKDIR을 다시 지정하면 그 다음 명령부터 디렉터리가 바뀝니다.
RUN은 빌드 시점에 명령을 실행하는 지시문이지, 작업 디렉터리를 지속해서 설정하는 방법은 아닙니다. 예를 들어 RUN cd /app은 해당 RUN에서 사용하는 셸 안에서만 디렉터리를 바꿉니다. 다음 RUN은 별도의 지시문으로 시작하므로 이전 셸의 디렉터리를 이어받지 않습니다. 한 지시문 안에서 명령들이 디렉터리 변경을 공유해야 한다면 RUN cd /app && make를 사용할 수 있습니다. 이 명령은 같은 셸에서 두 명령을 실행하며 cd가 성공한 뒤 make를 실행합니다. 이후 Dockerfile 명령에서도 해당 위치를 사용해야 한다면 WORKDIR /app을 사용하세요.
컨테이너를 시작할 때 작업 디렉터리 선택하기
docker run에 -w(또는 --workdir)를 지정하면 컨테이너의 초기 프로세스가 사용할 디렉터리를 선택할 수 있습니다. 예를 들어 docker run --rm -w /app alpine:3.20 pwd는 /app에서 프로세스를 시작하고 작업 디렉터리를 출력하도록 요청합니다. 이미지 이름은 alpine:3.20이고, 컨테이너에서 실행하는 명령은 pwd입니다. 컨테이너 안에 지정한 디렉터리가 없으면 Docker가 만듭니다. 이 옵션은 해당 컨테이너 실행에만 적용되며 Dockerfile을 수정하거나 이미지를 다시 빌드하지 않습니다.
위 명령은 설명을 위한 Docker 명령이며, 이 패킷에는 실행 증거가 없습니다. 결과를 확인하려면 Docker에 접근할 수 있는 호스트에서 실행하세요. 프로세스가 호스트 파일에 접근해야 할 때만 바인드 마운트가 필요합니다. 작업 디렉터리만 선택할 때는 필요하지 않습니다. 파일을 마운트한다면 호스트 경로와 컨테이너 경로를 각각 지정하고, -w로 선택한 경로가 컨테이너 경로인지 확인하세요.
실행 중인 컨테이너에서 디렉터리 변경하기
실행 중인 컨테이너에서 일회성 명령을 실행하려면 docker exec -w /app my_container pwd를 사용하세요. my_container는 컨테이너 이름이나 ID로, /app은 원하는 경로로 바꾸면 됩니다. -w 옵션은 해당 pwd 프로세스에 적용되며 컨테이너의 주 프로세스나 다른 명령의 디렉터리를 바꾸지는 않습니다.
대화형 셸을 사용하려면 docker exec -it my_container sh로 셸을 시작한 다음 프롬프트에서 cd /app을 입력하세요. 이미지에 Bash가 포함된 경우에만 sh 대신 bash를 사용하세요. 디렉터리 변경은 해당 셸 세션 동안 유지됩니다. 셸을 종료하면 변경이 사라지며, 컨테이너의 다른 프로세스에도 영향을 주지 않습니다. 이 명령은 이미 실행 중인 컨테이너가 있어야 하며 Docker 전용 문법입니다. 여기에는 Docker 실행 결과가 제공되지 않았습니다.
cd가 현재 셸에 어떻게 적용되는지 보여 주는 로컬 셸 예제를 보려면 다음 예제를 사용하세요. 제공된 패킷에서는 실행되지 않았으며 Docker도 필요하지 않습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
cd /tmp && printf 'Current directory: ' && pwd
이 예제는 입력한 셸에서 실행되며 Docker 컨테이너를 시작하거나 변경하지 않습니다. 이와 같은 적용 범위 때문에 대화형 컨테이너 셸에서 실행한 cd도 해당 셸에만 적용됩니다.
이미지의 빌드 시점 및 기본 디렉터리에는 WORKDIR을, 새 컨테이너의 초기 프로세스에는 docker run -w를 사용하세요. 실행 중인 컨테이너에서 시작하는 작업에는 docker exec -w나 대화형 셸을 사용하면 됩니다. 상대 경로에 의존하기 전에 선택한 디렉터리를 사용할 프로세스나 지시문이 무엇인지 확인하세요.