능글맞은 구렁이
Docker - Volume [ENV(환경변수), ARG(빌드 인수)] 본문
1. Docker에서 설정할 수 있는 두가지 변수
| 구분 | ENV(환경변수) | ARG(빌드 인수) |
| 설정 시점 | 컨테이터 실행 시 (run) | 이미지 빌드 시 (build) |
| 사용 위치 | 애플리케이션 코드 + Dockerfile | Dockerfile 내부만 |
| 컨테이너 실행 후 접근 | 가능 | 불가능 |
| 목적 | 런타임 설정 변경 | 빌드 시점 값 변경 |
2. ENV(환경변수)
- 목적
- 컨테이너 실행 시 동적으로 설정
- 애플리케이션 코드에서 접근 가능
- 이미지를 다시 빌드하지 않고도 컨테이너 실행 시 설정을 변경할 수 있게 해줌
* javaScript
process.env.PORT
*.env
PORT=8000
* dockerfile
ENV PORT=80 #또는 EXPOSE $PORT
* docker run에서 값 변경
방법 1. docker run -p 8000:8000 -e PORT=8000 my-image
방법 2. docker run --env PORT=8000 my-image
방법 3. docker run --env-file ./.env my-image
3. ARG(빌드 타임 인수)
- 목적
- 이미지를 빌드할 때 값 주입
- Dockerfild을 수정하지 않고 빌드 시점에서 값을 바꿔서 다른 이미지를 만들 수 있음
* dockerfile
ARG DEFAULT_PORT=80
ENV PORT=$DEFAULT_PORT
* docker build에서 값 전달
- docker build --build-arg DEFAULT_PORT=8000 -t my-image .
4. ENV와 ARG 차이
| 항목 | ENV | ARG |
| docker run에서 변경가능 | ⭕ | ❌ |
| docker build에서 변경 가능 | ❌ | ⭕ |
| 애플리케이션 코드 접근 | ⭕ | ❌ |
| 이미지에 남음 | ⭕ | ❌(빌드 후 사라짐) |
5. 정리
ARG는 이미지를 만들 때 쓰는 변수이고, ENV는 컨테이너는 실행 할 때 쓰는 변수이다.
🤔 그럼 ARG에 비밀번호를 사용해도 될까?
결론부터 말하자면 ❌
- 왜?
- 빌드 레이어 기록이 남아있을 수 있다.
- 특히, run 명령어에 비밀번호가 들어가면 레이어에 기록되기 때문에 이미지 공유하면 그대로 노출 가능하다.
- 또 CI/CD 로그에 값이 남는다.
따라서, ARG는 '빌드 설정용'이지 '비밀 저장용'이 아니다.
🤔그럼 ENV는 안전할까?
결론부터 말하자면 ❌
- 왜?
- docker inspect를 사용하면 환경변수가 전부 노출된다.
- 이미자 안에 영구적으로 저장이 되기 때문에 데이터가 노출된다.
- 컨테이너 내부에서도 쉽게 확인이 가능하다.
🤔그럼 안전한 방법은?
- Docker Secrets
- 런타임에만 주입
- 파일 형태로 제공
- inspect로 안보임
- 외부 Secret Manager를 이용하여 애플리케이션이 실행 할 때만 가져옴
- AWS secrets Manager
- HashiCorp Vault
- Azure key Vault
- GCP Secret Manager
🤔.env 파일은 괜찮을까?
결론부터 말하자면 개발환경에선 ⭕ 운영환경에서는 ❌
- 왜? git에 올라가면 끝!
- 그럼 ENV엔 어떤 변수가 적합할까?
- 비밀 아닌 값들의 설정용 변수에 적함 (PORT, API_URL, DEBUG=true등...)
'DevOps > Docker' 카테고리의 다른 글
| Docker - Volume (읽기전용) (0) | 2026.03.02 |
|---|---|
| Docker - Volumes 실습[바운드 마운트 생성] (0) | 2026.03.01 |
| Docker - Volumes 실습[ 익명 볼륨, 명명 볼륨 생성] (0) | 2026.02.24 |
| Docker - Volumes이란? (0) | 2026.01.18 |
| Docker - Docker Hub(image push&pull) (1) | 2024.02.06 |
Comments