728x90
개요
COPY 명령어는 Docker 호스트의 파일이나 디렉토리를 Docker 이미지로 복사하는 데 사용합니다.
즉, 도커에게 로컬 머신에 있는 어느 파일이 이미지에 들어가야 하는지 지정합니다.
이때 COPY 명령어에서 사용할 수 있는 경로 지정 방식 중 하나인 '..'(상위 디렉토리 지정)에 대해 정리하고자 합니다
COPY . .
기본적으로 COPY 명령어 다음에는 기본적으로 2개의 경로를 지정합니다.
COPY ./src /app
# ^^^^ ^^^^
# ① ②
# ① 호스트 머신의 현재 디렉토리 내 src 폴더
# ② 컨테이너 내부의 /app 디렉토리
1 번 째 경로
- Docker 빌드 컨텍스트 내의 소스 경로 (호스트의 파일이나 디렉토리 위치)
- 빌드 컨텍스트란 Dockerfile이 있는 디렉토리와 그 하위 디렉토리를 의미합니다
2 번 째 경로
- 컨테이너 내부의 목적지 경로 (이미지 내에서 파일이 위치할 곳)
1번 째 경로의 '.'
- Dockerfile이 포함된 현재 폴더를 의미합니다 (Dockerfile 자체는 제외)
- 현재 프로젝트의 모든 폴더, 하위 폴더 및 파일을 복사 대상으로 지정합니다
즉, 이 프로젝트의 모든 폴더, 하위 폴더 및 파일을 복사해야 한다고 도커에게 알리는 겁니다.
2번 째 경로의 '.'
- 복사된 파일을 저장할 이미지 내부의 현재 작업 디렉토리를 의미합니다
권장 사항
모든 Docker 이미지와 이미지를 기반으로 생성된 모든 컨테이너에는 호스트 머신의 파일 시스템과 완전히 격리된 '자체 파일 시스템'이 있습니다.
컨테이너 내부에서 파일을 관리할 때는 루트 디렉토리(/)에 직접 파일을 위치시키는 것보다 적절한 서브 디렉토리(예: /app, /usr/src/app 등)를 생성하여 사용하는 것이 권장됩니다.
# 권장하는 방식
COPY ./src /app/src
COPY package.json /app/
# 피해야 할 방식
COPY .. /
COPY . /
루트 디렉토리(/) 대신 서브 디렉토리를 사용하는 것이 권장되는 주요 이유는 다음과 같습니다.
1. 파일 시스템 구조의 명확성
- 애플리케이션 관련 파일들을 전용 디렉토리에 구조화하여 관리할 수 있습니다
- 컨테이너 내 파일들의 용도와 역할을 디렉토리 구조로 쉽게 파악할 수 있습니다
2. 시스템 파일과의 충돌 방지
- 루트 디렉토리에는 이미 시스템 필수 파일들이 존재합니다
- 애플리케이션 파일을 루트에 직접 넣으면 기존 시스템 파일들과 이름 충돌이 발생할 수 있습니다
- 실수로 중요한 시스템 파일을 덮어쓸 위험이 있습니다
3. 보안 강화
- 애플리케이션을 격리된 디렉토리에서 실행함으로써 시스템 파일에 대한 접근을 제한할 수 있습니다
- 권한 관리가 더 쉬워집니다
- 잠재적인 보안 취약점을 줄일 수 있습니다
4. 유지보수 용이성
- 애플리케이션 관련 파일들을 쉽게 찾고 관리할 수 있습니다
- 백업이나 업데이트 시 필요한 파일들을 명확하게 구분할 수 있습니다
- 여러 애플리케이션을 하나의 컨테이너에서 실행할 때 분리가 용이합니다
5. 모범 사례 준수
- Docker 공식 문서에서도 권장하는 방식입니다
- 다른 개발자들과의 협업이 용이해집니다
- 표준화된 구조를 따르므로 코드 리뷰나 디버깅이 쉬워집니다
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.12.03 - BufferedReader 사용 시 예외처리가 필요한 이유 (IOException, throws) (0) | 2024.12.03 |
---|---|
[TIL, 일일회고] 2024.12.02 - Docker 실행 중인 컨테이너 한 번에 종료(삭제)하는 방법 (0) | 2024.12.02 |
[TIL, 일일 회고] 2024.11.30 - VsCode > Docker 확장 프로그램 알아보기 (0) | 2024.11.30 |
[TIL, 일일 회고] 2024.11.29 - CS 간단 정리 : TCP와 UDP 차이 (0) | 2024.11.29 |
[TIL, 일일 회고] 2024.11.28 - CS 간단 정리 : HTTP와 HTTPS 차이 (2) | 2024.11.28 |