Docker

[Docker] Dockerfile References - .dockerignore file

patrick-star 2023. 8. 23. 23:07
728x90

docker CLI가 docker daemon에게 명령문들(context)을 전달하기 전에 명령문(context)의 root 디렉토리에 있는 .dockerignore 파일을 먼저 살펴본다.

만약에 .dockerignore 파일이 존재한다면, CLI(Command Line Interface).dockerignore 파일에 적혀있는 패턴과 일치하는 파일 또는 디렉토리들을 제외하기 위해서 명령문(context)들을 수정한다.

이를 통해 불필요하게 전송하는 용량이 큰 파일 또는 민감한 파일을 daemon에 전송하는 걸 막을 수 있다. 그런 파일들을 daemon에 전송해야 한다면 ADD 또는 COPY 명령어를 사용해서 이미지에 추가하면 된다.

CLI(Command Line Interface)는 .dockerignore 파일을 유닉스 쉘의 파일 글로브와 유사한 패턴의 줄바꿈으로 구분된 목록으로 해석한다. 명령어들의 root는 작업 디렉토리 와 루트 디렉토리 2가지로 고려된다.

일반적인 패턴

ex) .dockerignore 파일에 아래와 같이 적혀 있다

/foo/bar 
foo/bar

⇒ 해당 패턴은 PATH의 하위 디렉토리 foo에 있는 bar라는 이름을 갖는 파일과 디렉토리를 배제한다.
⇒ 또는 URL로 지정한 git 리포지토리의 root의 하위 디렉토리 foo에 있는 bar라는 이름을 갖는 파일과 디렉토리를 배제한다.

그 외 다른 것들은 배제하지 않는다.

주석 처리와 *

.dockerignore 파일#으로 주석처리한다.

ex)

# comment - 주석 처리 
*/temp* ⇒ root의 하위 디렉토리에서 temp로 시작하는 파일과 디렉토리를 제외한다. 
        ⇒ ex) /somedir/temporary.txt 과 /somedir/temp 가 제외된다.

*/*/temp* ⇒ root의 두 단계 아래에 잇는 하위 디렉토리에서 temp로 시작하는 파일과 디렉토리를 제외한다. 
          ⇒ ex) /somedir/subdir/temporary.txt 과 /somedir/subdir/temp 가 제외된다.
temp? ⇒ root와 같은 위치에 있는 폴더 중에서 temp로 시작해서 단 한글자만 덧붙여진 파일과 디렉토리를 제외한다.
      ⇒ ex) /tempa 와 /tempb 가 제외된다.

자세한 문자열 매칭은 해당 내용을 따른다.

전처리 과정에서 제거하는 것들

전처리 과정(preprocessing step)에서는 맨 앞에 있는 띄어쓰기맨 뒤에 있는 띄어쓰기를 제거하고
...해당 내용을 기반으로 제거한다. 빈 줄 역시 전처리 이후에 무시된다.

도커가 제공하는 **

뿐만 아니라 Docker는 특별한 와일드카드 **을 제공한다. 이 문자를 통해 모든 디렉토리의 문자열 매칭을 수행한다.
ex) **.*.go ⇒ build 명령어의 루트 디렉토리 뿐만 아니라 모든 디렉토리에 있는 .go로 끝나는 모든 파일들을 배제한다.

!

!로 시작하는 줄은 제외의 예외를 의미한다. 아래 예시를 보자.

*.md
!README.md 

위 예시는 .md로 끝나는 모든 파일을 배제하겠다는 뜻인데 그 중에서 README.md는 배제에서 제외하기 위해서 !을 앞에 붙였다.

!를 어디에 두냐에 따라 동작이 달라진다.
.dockerignore 마지막 줄에 !를 놓는다면 특정한 파일들을 배제에 포함시킬 건지 제외시킬건지 결정할 수 있다.

ex)

*.md
!README*.md
README-secret.md 

⇒ README-secret.md 파일 말고도 다른 README 파일들이 배제(ignore)에 제외되지 않았다. 
⇒ 즉, !를 제대로 사용하지 않은 거다.
*.md
README-secret.md
!README*.md

⇒ 모든 README file 들이 배제(ignore)에 포함되었다. 즉, README-secret.md는 배제(ignore)되지 않는다. 

이런 식으로 특정 패턴의 파일을 배제시키고 싶지 않다면 !.dockerignore 마지막 줄에 사용해야 한다.

물론 .dockerignore 파일Dockerfile.dockerignore 파일을 배제하기 위해서 사용할 수도 있다.
하지만, ADD, COPY와 같은 명령어가 이 파일들을 이미지에 복사하지는 않는다.

context에 포함시키고자 하는 파일을 지정하고 싶다면 ! 패턴 뒤에 *을 패턴의 첫 부분으로써 지정하면 된다.