따라서 npm install 이후 컨테이너에 설치된 node_modules을 익명볼륨에 마운트 → 이후 상위 폴더 바인딩마운트(컨테이너가호스트상태와동일하게유지) but 이미 node_modules가 마운트되어있기때문에 상위폴더에 맵핑된 호스트머신의 폴더 상태를 다시 카피해오지 않는다.
i.e.e 컨테이너내부경로 with 호스트머신경로 /app/node_modules with [somewhere] : 익명볼륨(따라서 숨겨진경로) /app with . #도커파일위치한현재경로 : bind mount
경로가 더 긴 익명볼륨 먼저 마운트 → 따라서 상위폴더의 bind mount로 호스트머신의 파일들을 /app으로 카피해올때 /app/node_modules는 예외가 된다.
Read Only Volume
BindMount 사용하는 이유는 호스트머신 상태를 컨테이너가 유지하는것이고, 실행중인 컨테이너가 호스트머신의 상태를 변경시키면 안된다. 하지만 default 상태는 RW이기때문에 읽기전용으로 바꾸어주어야 이러한 위험에서 완전히 벗어날 수 있다. → 따라서 ReadOnlyVolume의 필요성
-v [호스트경로]:[내부경로]:ro
위에서와 동일하게 상위폴더와 하위폴더의 권한이 다르다면, 경로가 더 긴 하위폴더의 권한을 우선하고 그 외의 것들은 상위폴더의 권한을 따른다.
Dockerfile COPY vs Bind Mount
docker run 은 개발중에 사용하는 명령이다.
프로덕션 환경에선 항상 코드의 스냅샷을 갖고 싶어 한다. 따라서 COPY를 사용
.dockerignore
COPY 명령으로 복사되면 안되는 폴더와 파일을 지정할 수 있다.
만약에 로컬에 node_modules가 존재했고 이것에 종속성이 누락되거나 old 버전일 경우 COPY되면 npm install로 만들어진 폴더를 덮어쓰기 때문에 무시해야한다.
ARG & ENV
ENV
도커파일에 추가
ENV PORT 80
이후 도커파일에서 이 변수를 사용 가능
EXPOSE $PORT
또한 다른 소스코드에서 process.env.PORT와 같은 형태로도 사용 가능
디폴트 값이 아닌 다른 값을 사용하고자 하면 docker run 커맨드에 옵션을 추가
--env PORT=8000
-e PORT=3000 -e NAME=”John”
.env 파일 생성해서 해줘도 된다.
PORT=8000
docker run 커맨드에서는 --env-file ./env
보안 주의
ARG
같은 이미지에 여러개의 다른 ENV 디폴트 값을 갖게해 실행하고 자 한다면
도커파일에서
ARG DEFAULT_PORT=80
ENV PORT $DEFAULT_PORT 이런 느낌으로 사용
이것은 소스코드에서는 사용불가하다. 도커파일에서만 사용가능하고 컨테이너가 시작될 떄 시작되는 런타임 명령이기 때문에 도커파일에서도 사용불가한 곳(CMD)도 있다.
디폴트값 아닌 것을 사용하고 싶을 때
docker run 커맨드에서 --build-arg DEFAULT_PORT=8000
ENV와 ARG 모두 레이어이며 이것이 변경될 경우 후속 레이어들도 리빌드 되기 때문에 도커파일에서 아래쪽에 위치시키는 것이 효율적이다.