Dockerfile에서 WORKDIR은 어떤 역할을 할까?
docker image를 생성하기 위해 작성해야하는 파일이다.
기본적으로 이렇게 쓴다. (node.js 기준)
FROM node:20
WORKDIR /app/start
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node","app.js"]
각 명령어에 대한 설명은 이 블로그를 참고하자.
구글링으로 WORKDIR을 검색했을때 리눅스 명령어 cd와 비슷한 명령어래서
"아 그럼 실행하면 실제로 현재 위치가 바뀌거나 이동되나?" 싶었다.
그래서 docker run으로 실행해봤는데도 바뀌는게 없었다.
뭐지? 싶어서 GPT에게 물어봤다.
📌 알아둬야 할 핵심 개념 3가지
1. 컨테이너 내부 디렉토리 경로 설정
- Dockerfile 내 이후의 명령어(RUN, CMD, COPY, ADD)들이 어느 디렉토리 기준으로 실행될지를 정함.
예시:
WORKDIR /app/start COPY . . # => 컨테이너 내부의 /app/start 기준으로 현재 폴더가 복사됨2. 디렉토리가 없다면 자동 생성됨
- /app/start가 존재하지 않아도 자동으로 만들어짐. 단, 이건 컨테이너 이미지 안에서만 보임.
- 호스트(EC2, PC) 파일시스템에는 아무 변화도 없음. 그래서 밖에서 보면 아무것도 안 생긴 것처럼 보임.
3. 호스트랑 컨테이너는 다른 세계
- Dockerfile이나 컨테이너 내부에서 설정한 디렉토리는 호스트에 영향을 주지 않음.
- Docker는 격리된 가상 환경을 만들기 때문이야. 외부에 /app/start가 생기지 않는 게 맞는 동작이야.

좋은 생각이다. 들어가보자.
docker run -it --rm your-image-name sh혹은
docker run -it --rm your-container-name sh로 컨테이너 내부에 들어갔다.
ls를 해보면?

뭔가 뜨는거같긴 하고?
이때 가장 먼저 해야할 것은 pwd로 현재 위치 확인하기다.

pwd로 확인했더니 현재 경로가 /app/start임을 확인할 수 있었다.
이건 docker container 내부로 sh로 들어가면 이렇게 나온다고 한다.
sh는 PS1(프롬프트 표시 형식)이 단순해서 경로를 표시하지 않음.
예: 그냥 # 만 나옴
흔히 우분투에서 보는 cli처럼 경로가 보이게 하려면 bash를 설치해주고 bash로 들어가면 된다.
apt update && apt install -y bash
bash

경로가 잘 보이는 걸 확인할 수 있다!
왜이럴까 싶었다. 이유는 단순했다.
아무것도 안 넣어서요.
| 디렉토리 | 설명 |
|---|---|
/root | root 유저의 홈 디렉토리. 기본적으로 비어 있음. |
/app/start | Dockerfile에서 WORKDIR와 COPY를 통해 지정된 작업 디렉토리. |
ls -l 결과가 0 | 그 디렉토리에 파일이 없다는 뜻. Docker는 필요 없는 건 만들지 않아. |
dockerfile쓰면서 이해가 안됬던 부분이라 실습하면서 이해되서 재밌었다.