2023.01.23 - [Docker] - DockerFile 작성하기 - 구성과 명령어 정리 - 1에 이어 명령어를 정리해 보자.
1. EXPOSE (deprecated)
EXPOSE 명령은 컨테이너가 런타임에 지정된 네트워크 포트에서 수신 대기함을 Docker에 알린다. 포트가 TCP 또는 UDP에서 수신하는지 여부를 지정할 수 있으며 프로토콜이 지정되지 않은 경우 기본 값은 TCP이다. EXPOSE 명령은 실제로 포트를 게시하지 않는다(주의!). 이미지를 빌드하는 사용자와 컨테이너를 실행하는 사용자 간에 게시할 포트에 대한 일종의 문서로 기능한다. 컨테이너를 실행할 때 실제로 포트를 게시하려면 도커 실행 시 -p 플래그를 사용하여 하나 이상의 포트를 게시 및 매핑하거나 -P 플래그를 사용하여 노출된 모든 포트를 게시하여 상위 포트에 매핑한다.
EXPOSE 80/udp
2. ENV
ENV <key>=<value> ...
ENV 명령은 환경 변수 Key를 값 value로 설정한다. 이 값은 인라인으로 대체할 수도 있다. 값은 다른 환경 변수에 대해 해석되므로 따옴표 문자는 이스케이프 되지 않으면 제거된다. 명령줄 구문 분석과 마찬가지로 따옴표와 백 슬래시를 사용하여 값 내에 공백을 포함할 수 있다.
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ENV 명령을 사용하면 한 번에 여러 개의 key = value 변수를 설정할 수 있으며, 아래 예제에서는 위와 동일한 결과를 얻을 수 있다.
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
ENV를 사용하여 설정된 환경 변수는 결과 이미지에서 컨테이너를 실행할 때 계속 사용된다. docker inspect를 사용하여 값을 볼 수 있으며 docker run -env <key>=<value>를 사용하여 값을 변경할 수 있다. 스테이지는 부모 스테이지에 의해 ENV를 사용하여 설정된 모든 환경 변수를 상속한다.
3. ADD
두 가지 form이 있다.
ADD [--chown=<user>:<group>] [--checksum=<checksum>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
공백을 포함하는 경로에는 후자의 형식이 필요하다.
Note!
--chown 기능은 Linux 컨테이너를 빌드하는 데 사용되는 Dockerfiles에서만 지원되며 Windows 컨테이너에서는 작동하지 않는다. 사용자 및 그룹 소유권 개념은 Linux와 Windows 간에 변환되지 않으므로 사용자 그룹 및 이름을 ID로 변환하기 위해 /etc/passwd 및 /etc/group을 사용하면 Linux OS 기반 컨테이너에서만 기능을 사용할 수 있다.
ADD 명령은 <src>에서 새 파일, 디렉터리 또는 원격 파일 URL을 복사하여 <dest> 경로에 있는 이미지의 파일 시스템에 추가한다.
여러 <src> 리소스를 지정할 수 있지만 파일 또는 디렉터리인 경우 해당 경로는 build context source와 관련하여 해석된다. 각 <src>에는 와일드카드가 포함될 수 있다. 예를 들면 {hom}으로 시작하는 모든 파일을 추가하려면 아래와 같다.
ADD hom* /mydir/
아래 예제에서 "?"는 "home.txt"와 같은 단일 문자로 대체된다.
ADD hom?.txt /mydir/
<dest>는 source가 대상 컨테이너 내부에서 복사되는 절대 경로 또는 WORKDIR과 관련된 경로이다. 아래 예제로는 상대 경로를 사용하고 <WORKDIR>/relativeDir/에 {test.txt}를 추가한다.
ADD test.txt relativeDir/
다음은 절대 경로이다.
ADD test.txt /absoluteDir/
- 선택적 --chown 플래그가 지정된 사용자 이름, 그룹 이름 또는 UID/GID 조합을 지정하여 추가된 콘텐츠의 특정 소유권을 요청하지 않는 한 모든 새 파일과 디렉터리는 UID와 GID가 0인 상태로 생성된다.
- --chown 플래그의 형식은 사용자 이름 및 그룹 이름 문자열 또는 직접 정수 UID 및 GID를 임의로 조합할 수 있다.
- 그룹 이름이 없는 사용자 이름 또는 GID가 없는 UID를 제공하면 GID와 동일한 숫자 UID가 사용된다.
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
URL 파일이 인증을 사용하여 보호되는 경우 ADD 명령이 인증을 지원하지 않으므로 컨테이너 내에서 RUN wget, RUN curl 또는 다른 도구를 사용해야 한다.
3.1 ADD git repo ADD <gir ref> <dir>
이 양식을 사용하면 이미지 내부에서 git 명령을 사용하지 않고 직접 이미지에 git 저장소를 추가할 수 있다.
ADD [--keep-git-dir=<boolean>] <git ref> <dir>
# syntax=docker/dockerfile-upstream:master-labs
FROM alpine
ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.10.1 /buildkit
--keep-git-dir=true 플래그는. git 디렉터리를 추가한다. 이 플래그는 false로 기본 설정 한다.
3.2 Adding a private git repo
ssh를 통해 개인 레포를 추가하려면 다음 형식의 Dockerfile을 생성해라.
# syntax = docker/dockerfile-upstream:master-labs
FROM alpine
ADD git@git.example.com:foo/bar.git /bar
이 Dockerfile은 docker build --ssh or buildctl buid --ssh로 빌드할 수 있다.
docker build --ssh default
buildctl build --frontend=dockerfile.v0 --local context=. --local dockerfile=. --ssh default
4. COPY
기본적으로 ADD와 비슷하다. 다만 COPY는 압축 파일을 추가할 때 압축을 해제하지 않고, 파일 URL도 사용할 수 없다.
COPY는 두 가지 형태를 가진다.
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY 명령어는 <src>에서 새 파일이나 디렉터리를 복사하고 <dest> 경로에서 컨테이너의 파일 시스템에 추가한다. 여러 <src> 리소스를 지정할 수 있지만 파일 및 디렉터리의 경로는 build context의 source와 관련하여 해석된다. 각 <src>에는 와일드카드(*)가 포함될 수 있다.
COPY hom* /mydir/
4.1 COPY --link
COPY 또는 ADD명령에서 이 플래그를 사용하면 파일이 자체 계층에서 독립적으로 유지되고 이전 계층의 명령이 변경될 때 무효화되지 않는다. --link를 사용하면 원본 파일이 빈 대상 디렉터리에 복사된다. 해당 디렉터리가 이전 상태 위에 연결된 계층으로 변환된다.
# syntax=docker/dockerfile:1
FROM alpine
COPY --link /foo /bar
이것은 두 가지 빌드를 수행하는 것과 같다.
FROM alpine
그리고
FROM scratch
COPY /foo /bar
두 이미지의 모든 레이어를 병합한다.
참고
'Docker' 카테고리의 다른 글
Docker Multi-Stage (1) | 2023.04.21 |
---|---|
Docker Compose - 1 (0) | 2023.02.23 |
DockerFile 작성하기 - 구성과 명령어 정리 - 1 (0) | 2023.01.23 |
Docker에 대해 알아보자 - 정의, 작동 방식, 사용 이유 (0) | 2023.01.22 |
[Docker] 1. WSL2 에 Docker 개발 환경 구축하기 (0) | 2022.11.28 |