능글맞은 구렁이

Docker - Volume [ENV(환경변수), ARG(빌드 인수)] 본문

DevOps/Docker

Docker - Volume [ENV(환경변수), ARG(빌드 인수)]

보라색츄르 2026. 3. 1. 18:11

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등...)

 

 

 

Comments