Dockerfile Reference 2장

Image credit: docker.com

Dockerfile Reference 2장

6. .dockerignore file

Docker CLI가 context를 docker daemon에 전송하기 전에, context의 ROOT 디렉토리에서 .dockerignore 이름의 파일을 찾아본다. 만일 파일이 존재한다면 CLI는 그 안에 작성된 패턴과 일치하는 파일과 디렉토리를 제외하여 context를 변경한다. 이렇게하면 크거나 민감한 파일과 디렉토리를 불필요하게 데몬에 보내지 않고 ADD 또는 COPY를 사용하여 이미지에 추가 할 수 있다.
CLI는 .dockerignore 파일을 유닉스 쉘의 glob을 줄바꿈하여 분리한 목록으로 해석한다. context의 ROOT는 작업 디렉토리와 ROOT 디렉토리로 간주한다.
예를 들어 /foo/bar 그리고 foo/bar 패턴은 모두 foo의 서브 디렉토리 또는 서브 모듈 중 bar라는 파일 또는 디렉토리를 제외한다.
만일 .dockerignore 파일의 첫 행이 #으로 시작하면, 이 행은 주석으로 간주되고 CLI에 의해 해석되기 전에 무시된다.

# comment
    */temp*
    */*/temp*
    temp?

이 파일로 야기되는 상황을 추측해보자.

Rule Behavior
1 line 주석이기 때문에 무시된다.
2 line ROOT의 모든 하위 디렉토리에서 temp로 시작하는 파일 및 디렉토리를 제외한다.
3 line ROOT의 두 레벨 아래에 있는 서브 디렉토리에서 temp로 시작하는 파일 및 디렉토리를 제외한다.
4 line ROOT 디렉토리에서 이름이 temp로 시작하고 뒤에 임의의 한 문자가 추가된 파일 및 디렉토리를 제외한다.

glob (programming)
컴퓨터 프로그래밍에서, 특히 unix 같은 환경에서 glob 패턴은 와일드카드 문자로된 파일 이름을 구체화한다.
예를 들어 unix 명령어 mv *.txt textfiles/ 는 현재 디렉토리에서 끝이 .txt로 끝나는 파일을 textfiles 디렉토리로 이동시켜준다.
여기서 *는 모든 문자를 뜻하는 와일드카드이고 *.txt는 glob 패턴이다. 다른 와일드카드 문자로는 하나의 문자를 뜻하는 물음표(?)가 있다.

매칭은 Go의 filepath.Match 규칙을 사용하여 행해진다. 앞과 뒤 공백을 제거하는 전처리 과정이 있으며, . 그리고 .. 요소들은 Go의 filepath.Clean 규칙을 사용한다. 사전 처리 후 비어있는 행은 무시된다.

Docker는 임의의 수의 디렉토리와 일치하는 특수 와일드카드 문자열 *도 지원한다. 예를 들어 **/.go는 build context의 ROOT를 포함하여 모든 디렉토리에서 발견되는 .go로 끝나는 모든 파일을 제외시킨다.


느낌표(!)로 시작하는 행은 제외에 대한 예외를 생성하는데 사용할 수 있다.

*.md
!README.md

README.md 파일을 제외한 모든 마크다운 파일을 context로 부터 제외시킨다.


느낌표(!)의 배치는 .dockerignore의 마지막 행에 해당하는 파일 또는 디렉토리가 제외 될것인지 포함될 것인지를 결정한다.

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

README-secret.md를 제외한 README 파일들을 제외하고 context에서 모든 마크다운 파일들이 제외된다.

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

모든 README 파일들이 포함된다. 나중에 작성된 행이 README-secret.md와도 매칭되기 때문에 가운데 행은 아무런 영향을 미치지 못한다.

7. FROM

FROM <image>

또는

FROM <image>:<tag>

또는

FROM <image>@<digest>

FROM 명령어는 기본 이미지를 설정해준다. Dockerfile의 첫 번째 명령어는 FROM 이어야만 한다. 유효한 모든 이미지가 기본 이미지가 될 수 있다. 특히 퍼블릭 저장소에서 이미지를 가져 와서 시작하는 것이 쉽다.

  • FROM은 주석이 아닌 첫 번째 명령어야만 한다.
  • FROM은 여러 개의 이미지를 만들려면 여러 번 작성될 수 있다.
  • TAG 또는 digest 값은 선택이다. 기입하지 않았다면 가장 최근 이미지가 선택된다.

8. MAINTAINER

MAINTAINER <name>

MAINTAINER 명령어는 생성된 이미지에 Author 필드를 설정할 수 있게 해준다.

9. RUN

RUN 명령어는 두 가지 형식이 있다.

  • RUN <command> : shell 형식, 기본적으로 Linux에서는/bin/sh -c이고 Windows에서는cmd /S /C```` 이다.
  • RUN ["executable", "param1", "param2"] : exec 형식

RUN 명령어는 현재 이미지위에 새로운 레이어에서 모든 명령을 실행하고 그 결과를 커밋한다. 커밋된 이미지는 Dockerfile의 다음 단계에 사용된다.

Known issues
  • Issue 783는 파일 권한 문제에 대한 것이다. AUFS 파일 시스템을 사용할 때 발생할 수 있다. 예를 들어 파일을 rm 하려 시도하는 동안에 최신 AUFS 시스템의 경우 dockerperm1 옵션을 사용해서 레이어를 마운트해 docker가 자동으로 rm을 하지 못하도록 한다. dirperm1 옵션에 관련한 더욱 자세한 내용은 AUFS 메뉴얼 페이지에서 찾아볼 수 있다.

10. CMD

11. LABEL

12. EXPOSE

13. ENV

14. ADD

15. COPY

16. ENTRYPOINT

17. VOLUME

위 글은 Docker 공식사이트에서 제공하는 문서기준으로 작성되었습니다.

comments powered by Disqus