'Tool/Docker'에 해당하는 글 10건

운영 서버에서 docker 를 사용하다 보면 사용하지 않는 image 및 container 등이 늘어나 디스크 공간을 차지하기 마련이다. 그래서 아래의 명령을 cron 으로 스케줄링하여 무쓸모 image 및 container 는 삭제하는 것이 좋다. (참고로 AWS ECS 에서는 ECS 컨테이너 에이전트가 컨테이너 인스턴스에서 사용하지 않은 이미지/컨테이너 등을 자동으로 정리해 준다. 오홍~)


$ docker rm $(docker ps -a)

$ docker rmi $(docker images -a)


하지만 로컬 호스트의 경우 운영 서버와는 다르게 각종 이미지들이 쌓여 있을 것이고 지워야 할 것들과 지우지 말아야 할 것들을 구분해야 한다. 위 명령으로 실행중이지 않은 모든 이미지와 컨테이너를 삭제해도 큰 문제는 없지만 다시 필요한 이미지를 생성하거나 다운받아야 하는 불편함이 생길 수 있다. 혹여라도 대기 중인 image 를 삭제하지 않게 prune 명령을 사용하여 dangling 이미지, 컨테이너, 볼륨, 네트워크를 삭제하는 것이 좋다.


$ docker container prune -f

$ docker image prune -f



Prune images


$ docker image prune -f
cs


컨테이너에서 태그가 지정되지 않고 어느 컨테이너에서도 참조하지 않는 dangling image 를 삭제한다. 모든 이미지 리스트(docker images -a) 에서 repository 와 tag 가 <none> 으로 설정되어 있는 이미지 중 어느 컨테이너에서도 참조하고 있지 않은 이미지를 dangling image 라고 한다. 이 dangling image 는 별다른 설정이 없다면 다시 사용되지 않을 이미지들이며, 동일한 repository:tag 로 이미지가 생성되어 기존 이미지에 덮어씌워질 때 나타난다.

docker rmi $(docker images -f "dangling=true") 명령과 동일하다. 이 명령으로 이미지가 삭제되지 않았다면 다른 컨테이너에서 참조 중이거나 이미 실행중인 것이다. --force(-f) 플래그는 강제 삭제가 아닌 프롬프트 무시 플래그이다.


$ docker image prune -a -f
cs


컨테이너가 생성되지 않은(실행 및 중지 상태가 아닌) 모든 이미지를 삭제한다. 종료되었지만 프로세스에 남아있는 컨테이너의 이미지는 삭제하지 못한다. docker rmi -f $(docker images -a) 명령은 위 명령과 비슷하지만, 프로세스에 남아있는 종료된 컨테이너의 이미지도 삭제한다.


이미지가 많아서 필터링이 필요한 경우는 아래와 같이 --filter 플래그를 사용할 수 있다. --filter "key=value" 형식이며, 여러 개의 --filter 플래그를 같이 사용할 수 있다. 필터링에 사용할 수 있는 key 는 특정 시간 이전에 생성된 이미지를 지정하는 until 과 label 일치 여부로 비교하는 label 이 있다.


$ docker image prune -f -a --filter "until=24h"
$ docker image prune -a --force --filter "until=2017-01-04T00:00:00"
$ docker image prune --filter="label=deprecated"
$ docker image prune --filter="label=maintainer=john"
$ docker image prune --filter="label!=maintainer"
$ docker image prune --filter="label!=maintainer=john"
cs



Prune containers


컨테이너는 docker run 으로 시작할 때 --rm 플래그를 지정하지 않으면 컨테이너 중지시에 자동으로 제거되지 않는다. docker ps -a 명령으로 호스트의 모든 컨테이너, 실행 중이거나 중지된 모든 컨테이너를 확인할 수 있으며, 중지된 컨테이너의 디스크 공간을 확보하기 위해 docker container prune 명령을 사용할 수 있다. 위 docker image prune 과 마찬가지로 필터링을 사용할 수 있다.


$ docker container prune
$ docker container prune --filter "until=24h" 
cs


마찬가지로 volume 과 network 도 prune 명령으로 제거할 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Docker Hub

Tool/Docker 2016. 2. 8. 12:32

Docker Hub 는 Docker사가 운영하는 공개 저장소이며, 다른 사람들과 이미지를 공유할 수 있다.

또한 공유하고 싶지 않은 이미지를 저장할 수 있는 개인 저장소도 제공한다.

그리고 개인 저장소는 조직을 구성하여 그 구성원에게만 공유할 수도 있다.

Docker Hub 와 관련된 명령어는 pull, login, push 이다.

Docker Hub 사이트에서 가입하거나 login 명령을 사용하여 계정을 생성하면 서비스를 이용할 수 있다.


# docker login
Username: ggamzzak
Password:
Email: ggamzzak@gmail.com
WARNING: login credentials saved in ~/.docker/config.json
Account created. Please use the confirmation link we sent to your e-mail to activate it.
cs


공개 저장소에서 사용될 username / password / email 주소를 입력하면 자동으로 로그인 된다.

인증 파일은 ~/.docker/config.json 에 저장된다.


로그인 인증이 되었으므로 자신의 이미지를 Docker Hub 로 push 하고, 다른 사람들과 이미지를 공유한다.

로컬 이미지를 레지스트리의 저장소와 매칭시키는 표기법은 username/repository:tag 이다. 태그는 선택 사항이지만 권장 사항이다.

원하는 목적지에 업로드되도록 docker tag 명령으로 사용자 이름, 저장소 및 태그 이름을 정확하게 지정하여 원본 이미지를 태깅한다.


$ docker tag sourceImage username/repository:tag


# docker tag ubuntuV1 ggamzzak/ubuntu:v1
# docker push ggamzzak/ubuntu:v1
The push refers to a repository [docker.io/ggamzzak/ubuntu] (len: 1)
fd0818beae1d: Pushed
f80999a1f330: Pushed
2ef91804894a: Pushed
92ec6d044cb3: Pushed
v1: digest: sha256:117759e03c98d637fec6fcf5d605c6a2b9e94e07cbe4fb5628e2dbab1779ef00 size: 8402
cs



Automated Builds


Docker Hub 는 공유/개인 저장소 외에도 Automated Builds 를 제공한다.

Automated Builds 는 GibHub 나 Bitbucket 에서 Docker Hub 로 이미지의 빌드와 갱신을 자동화한다.


Automated Build 설정하기


  1. Docker Hub 계정 생성하고 로그인
  2. Linked Accounts & Services 메뉴에서 GitHub 나 Bitbucket 계정 연결
  3. Create - Automated Build
  4. 연동할 GitHub 프로젝트 선택나 Bitbucket 프로젝트 선택


이제 GitHub 에 Dockerfile 을 작성하여 push 하면 Docker Hub 의 이미지가 재생성(re-build)된다.



Webhook


webhook 은 automated build 저장소의 이벤트에 응답하여 지정한 목표 URL 로 정보를 보내준다.

이벤트는 이미지 빌드, 새 태그 추가 등이 되겠다.

이벤트가 발생하면 webhook 은 지정된 URL 로 JSON 형식의 결과를 전달한다.

URL 에서는 그 형식을 받아 원하는 기능을 구현할 수 있다.

예를 들어 URL 에 webhook 으로부터 JSON 파일이 전달되면 파싱하여 내용을 slack 등의 어플리케이션으로 알릴 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

나만의 Image 만들기


docker run 시 Docker 는 Docker 호스트에서 이미지를 다운받아 저장한다.

Docker 호스트에 이미지가 없을 때는 기본적으로 Docker Hub 저장소에서 다운받는다.

이 다운로드 받은 이미지의 설정을 변경하고 어플리케이션을 추가하고 새 이미지로 생성하여 Docker Hub 저장소에 올릴 수 있다.

docker search 명령을 사용하거나 Docker Hub 사이트에서 다른 사람들이 올린 이미지를 검색할 수 있다.


# docker search ubuntu
 
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                            Ubuntu is a Debian-based Linux operating s...   3108      [OK]
ubuntu-upstart                    Upstart is an event-based replacement for ...   61        [OK]
torusware/speedus-ubuntu          Always updated official Ubuntu docker imag...   25                   [OK]
ubuntu-debootstrap                debootstrap --variant=minbase --components...   24        [OK]
tleyden5iwx/ubuntu-cuda           Ubuntu 14.04 with CUDA drivers pre-installed    19                   [OK]
rastasheep/ubuntu-sshd            Dockerized SSH service, built on top of of...   19                   [OK]
cs


검색 결과를 보면 우측에 두가지 저장소 형태가 있다.

OFFICIAL 저장소는 Docker사 에서 제공되는 것이고, 이름에 접두어가 붙지 않는다.

AUTOMATED 저장소는 이미지의 소스와 컨텐츠를 사용자가 검증하도록 하는 것이다.

NAME 의 슬래시(/) 앞의 접두어는 해당 이미지를 만든 username 이다.


새 기본 이미지를 하나 다운받는다. (태그 없이 latest 버전을 사용하는 것보다 특정 태그를 명시하여 이미지를 사용하는 것이 명확하고 좋다.)


# docker pull ubuntu:14.04
cs


이미지를 다운받아 내용을 변경하고 이미지를 생성하는데는 docker commit 과 docker build 을 사용하는 두가지 방법이 있다.


- docker commit 으로 변경된 새로운 이미지 생성하기

- docker build (Dockerfile) 로 이미지 생성하기



1. docker commit 으로 이미지 생성하기


이미지를 변경하기 위해 해당 이미지로부터 컨테이너를 생성한다.


# docker run -t -i ubuntu:14.04 /bin/bash
root@8df050ac77ba:/# apt-get update
root@8df050ac77ba:/# apt-get upgrade
root@8df050ac77ba:/# exit
cs


패키지를 업데이트 및 업그레이드를 했으므로 컨테이너는 변경되었다.

이제 변경된 컨테이너를 이미지로 커밋한다.

docker commit 은 컨테이너를 새 이미지로 생성한다.


# docker commit -m "Added apt update" -a "ggamzzak" 8df050ac77ba ggamzzak/ubuntu:v1
15d7b97c7364cdde78fb39368b468098065ede849e8c6ee665ae3e1810cdb6c1
cs


-m 옵션은 커밋 메시지, -a 옵션은 커밋한 사람(author)을 지정한다.

이미지로 생성할 컨테이너 id 8df050ac77ba, 마지막에는 새로 생성될 이미지와 태그를 지정한다.


생성된 이미지를 확인한다.


# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ggamzzak/ubuntu     v1                  15d7b97c7364        19 seconds ago      216.5 MB
ubuntu              14.04               6cc0fc2a5ee3        13 days ago         187.9 MB
cs



2. docker build (Dockerfile) 로 이미지 생성하기


docker commit 은 이미지를 확장하는 아주 간단한 방법이지만 이미지 개발 과정을 쉽게 공유할 수 없다.

docker build 는 Dockerfile 을 기반으로 이미지를 생성하므로 Dockerfile 로 개발 과정을 공유할 수 있다.


# vi Dockerfile
FROM ubuntu:14.04
MAINTAINER Gabriel Lee <test@test.com>
RUN apt-get update && apt-get upgrade
cs


# docker build -t ggamzzak/ubuntuf:v1 .
Step 1 : FROM ubuntu:14.04
 ---> 6cc0fc2a5ee3
Step 2 : MAINTAINER Gabriel Lee <test@test.com>
 ---> Running in 5148283c2f29
 ---> c167d91fdfa4
Removing intermediate container 5148283c2f29
Step 3 : RUN apt-get update && apt-get upgrade
 ---> Running in e415cec47fe0
Ign http://archive.ubuntu.com trusty InRelease
Get:1 http://archive.ubuntu.com trusty-updates InRelease [64.4 kB]
...
Successfully built 94010692cd90
cs


docker build 명령의 마지막 . 은 Dockerfile 경로이다.


Dockerfile 을 빌드하면 위에서 처럼 Dockerfile 의 각 명령 별로 새로운 컨테이너가 생성/제거되는 것을 볼 수 있다.

각 명령을 독립적으로 처리하는 것을 볼 수 있고, 각 명령별로 생성되는 컨테이너를 레이어라고도 한다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Create a base image

Tool/Docker 2016. 2. 5. 01:09

Docker Hub 에서 제공하는 이미지를 사용하지 않고 새로운 베이스 이미지 제작하기.

두가지 방법이 있다.


- debootstrap 과 docker import 를 사용하는 방법

- scratch 을 베이스 이미지로 docker build 하는 방법



1. debootstrap 사용


debootstrap 은 현재 시스템에 또 다른 Debian 기반의 시스템을 설치할 수 있는 툴이다.

debootstrap 를 사용하여 서브디렉토리에 ubuntu 를 하나 더 설치하고 이미지로 만들 것이다.


# apt-get install debootstrap
# debootstrap trusty ubuntu1404
cs


ubuntu1404 디렉토리에 Ubuntu 14.04 버전인 trusty 의 바이너리 파일이 생성되었다.


docker import 로 이미지를 만들려면 tar 압축 파일이 필요하다. 

ubuntu1404 디렉토리를 tar 파일로 압축해야 한다. 압축 후에 myUbuntu 라는 이미지로 생성한다.


# tar -C ubuntu1404 -c . | docker import - myUbuntu
e72dd803924af5636a1181c693846f3d1b3d4aa63639d83b27d22da835c91a3f
cs


docker import 는 tar 파일로 압축된 파일 시스템으로부터 이미지를 생성한다. URL 을 사용할 수도 있다.


아래 명령은 현재 디렉토리의 내용을 바로 hello 이미지로 생성한다.


# tar -c . | docker import - hello
cs


이미지가 생성되었는지 확인한다.


# docker images
cs



2. scratch 사용


컨테이너를 빌드하기 위해 scratch 라는 빈 이미지를 예약어를 사용할 수도 있다. 

Docker Hub 에 많은 scratch 가 있지만 pull, run 등 아무것도 할 수 없다.

이미지가 비어있기 때문에 컨테이너를 생성할 수는 없고, 빈 이미지로 시작하고 싶다면 Dockerfile 에서 scratch 예약어를 지정하면 된다.

그리고 Dockerfile 의 scratch 다음에 원하는 명령어들을 나열하고 build 하면 scratch 이미지를 사용하여 컨테이너를 생성할 수 있다.


FROM scratch
ADD hello /
CMD ["/hello"]
 
docker build --tag hello:0.1 .
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Dockerfile

Tool/Docker 2016. 2. 4. 00:13
# Firefox over VNC
#
# VERSION               0.3
 
FROM ubuntu
 
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -'echo "firefox" >> /.bashrc'
 
EXPOSE 5900
CMD    ["x11vnc""-forever""-usepw""-create"]
cs



위처럼 특정 디렉토리에 Dockerfile 을 만들면 docker build 명령으로 이 파일과 컨텍스트를 기반으로 이미지를 생성할 수 있다.

컨텍스트는 로컬 PATH 나 Git URL 에 지정된 위치에 있는 파일들을 말한다.


Dockerfile 에는 새 이미지를 만들기 위한 각종 명령/설정을 순서대로 작성한다.

베이스 이미지, 추가적으로 패키지를 설치하기 위한 명령, 기타 실행하고 설정할 명령들을 명시한다.

빈 디렉토리에 컨텍스트를 만들어 각 Dockerfile 과 빌드에 필요한 파일들을 넣어 빌드할 수 있도록 한다.

이미지 생성에 불필요한 파일 등은 .dockerignore 파일을 사용하여 빌드에서 제외시켜 빌드 성능을 높일 수 있다.



공통


- Docker 는 Dockerfile 에 작성된 명령들을 순서대로 처리한다.

- 각 명령은 이미지의 새 레이어를 만들며, 127개 이상의 레이어를 가질 수 없다.

- 주석은 # 를 사용한다.

- <명령> <매개변수> 형식으로 사용되며, 인수를 구분하기 위해 명령은 대문자를 사용한다.

- Dockerfile 의 첫번째 명령은 반드시 베이스 이미지를 지정하는 FROM 명령으로 시작한다.

- exec form 의 경우 JSON 배열로 파싱되므로 큰따옴표(")를 사용한다.


다음은 Dockerfile 에 명시할 수 있는 명령들이다.



FROM


FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
cs


어떤 이미지를 기반으로 새 이미지를 생성할 것인지 지정한다.

로컬 호스트에 베이스 이미지가 존재하지 않으면 Docker Hub 에서 받아온다.

가능하면 official 저장소의 이미지, 또 완전한 기능을 하며 크기가 작은 Alpine 이미지를 사용하도록 한다.



MAINTAINER


MAINTAINER <name>
cs


이미지를 생성한 사람의 정보를 설정한다.



RUN


RUN /bin/sh script (shell form)
RUN ["executable""param1""param2"] (exec form)
RUN ["/bin/bash", "-c", "set -o pipefail && wget -O - https://some.site | wc -l > /number"]
cs


FROM 에서 설정한 이미지에서 스크립트나 명령을 실행한다.

exec 형식의 경우, 명령을 실행하는 쉘을 지정하여 사용할 때 주로 사용한다.

너무 긴 구문은 가독성과 유지보수를 생각해서 백슬래시(\)로 여러 행을 만들어 구분한다.


# use /bin/sh format
RUN apt-get install -y nginx
# no shell format
RUN ["apt-get""install""-y""nginx"]
cs


RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    lxc=1.0* \
    mercurial \
    ruby1.9.1 \
    s3cmd=1.1.* \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
cs


package-foo=1.3.* 처럼 특정 패키지 버전을 명시하여 캐시를 무효화 할 수도 있다.

/var/lib/apt/lists/ 디렉토리의 모든 파일을 삭제하면, 이미지 크기를 줄이는데 도움이 된다.



CMD


CMD ["executable","param1","param2"] (exec form)
CMD ["param1","param2"] (ENTRYPOINT의 파라미터)
CMD command param1 param2 (shell form)
cs


컨테이너가 시작되었을 때 이미지에 포함된 소프트웨어를 인수와 함께 실행하는데 사용한다.

Dockerfile 에서 CMD 명령은 한 번만 사용 가능하며, 여러 개의 CMD 를 작성할 경우 맨 마지막 명령만 동작한다.

exec form 내에 변수를 사용하려면 shell form 을 사용하던지 shell 처리 exec form 을 사용해야 한다.


CMD [ "echo""$HOME" ] (X)
CMD [ "sh""-c""echo""$HOME" ] (O)
cs



ENTRYPOINT


ENTRYPOINT ["executable""param1""param2"] (exec form)
ENTRYPOINT command param1 param2 (shell form)
cs


컨테이너가 시작되었을 때 실행할 스크립트나 명령을 명시하며 CMD 명령보다 선행된다.

docker run -i -t --rm -p 80:80 nginx 라고 커맨드 라인에 입력한 매개변수 nginx 는 ENTRYPOINT 의 뒤에 추가되고, CMD 에 사용된 모든 요소를 덮어 씌운다.

--entrypoint 플래그를 사용하면 ENTRYPOINT 를 덮어 씌울 수 있다.



LABEL


LABEL <key>=<value> <key>=<value> <key>=<value> ...
cs


이미지에 메타데이터를 추가한다.


LABEL "com.example.vendor"="ACME Incorporated" \
      com.example.label-with-value="foo" \
      version="1.0" \
      description="This text illustrates \
      that label-values can span multiple lines." \
      multi.label1="value1" \
      multi.label2="value2" \
      other="value3"
cs


docker inspect 명령시 이미지 Label 을 확인할 수 있다.


"Labels": {
    "com.example.vendor""ACME Incorporated"
    "com.example.label-with-value""foo",
    "version""1.0",
    "description""This text illustrates that label-values can span multiple lines.",
    "multi.label1""value1",
    "multi.label2""value2",
    "other""value3"
},
cs



EXPOSE


EXPOSE <port> [<port>...]
cs


EXPOSE 명령으로 컨테이너가 연결(Listen)할 포트를 지정한다. --expose 옵션과 동일하다.

EXPOSE 명령으로 호스트에서 접근 가능한 컨테이너의 포트를 만들지는 않으며 포트를 외부에 노출하려면 -p, -P 옵션을 사용한다.

하나의 포트를 EXPOSE 하고 또 다른 포트로 외부에 노출할 수 있다.



ENV


ENV <key> <value>
ENV <key>=<value> ...
cs


컨테이너가 설치하는 소프트웨어에 대해 ENV 를 사용하여 PATH 환경 변수를 업데이트 할 수 있다. -e --env 옵션과 동일하다.

정의된 환경 변수는 Dockerfile 의 거의 모든 명령에 $ 표시로 적용 가능하다.


FROM busybox
ENV foo /bar
WORKDIR ${foo}   # WORKDIR /bar
ADD . $foo       # ADD . /bar
COPY \$foo /quux # COPY $foo /quux
 
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
cs



ADD


ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
cs


<src> 경로의 파일/디렉토리를 컨테이너의 경로<dest>에 복사한다.

<src> 는 컨텍스트 디렉토리를 기준으로 하며 컨텍스트 외부로의 상대/절대 경로는 사용할 수 없다.

로컬에 있는 압축 파일(tar.gz, tar.bz2, tar.xz)은 압축을 해제하고 tar를 풀어서 추가된다. 단, 인터넷에 있는 파일 URL은 압축만 해제한 뒤 tar 파일이 그대로 추가된다.

url 방식의 압축파일일 경우 압축만 해제하고 tar 는 해제하지 않아 이미지 용량이 늘어나므로 RUN wget 이나 curl 을 이용한다.

<src> 의 내용이 변경된 경우, ADD 이후의 모든 명령에는 캐시가 무효화된다.

ADD ./ /hello/ 와 같이 현재 디렉터리를 추가할 때 .dockerignore 파일에 설정한 파일과 디렉터리는 제외된다.


ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir          # adds "test" to /absoluteDir
cs



COPY


COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
cs


<src> 경로의 파일/디렉토리를 컨테이너의 경로<dest>에 복사한다.

ADD 명령과 복사한다는 기능은 같지만, 로컬 파일을 컨테이너에 복사하는 기능만을 하며, 명확하기 때문에 ADD 명령보다 선호한다.

ADD와는 달리 COPY는 압축 파일을 복사할 때 압축을 해제하지 않고 압축 파일 그대로 복사하며 파일 URL도 사용할 수 없다.

COPY ./ /hello/ 와 같이 현재 디렉터리를 추가할 때 .dockerignore 파일에 설정한 파일과 디렉터리는 제외된다.



VOLUME


VOLUME ["/data"]
cs


호스트나 다른 컨테이너의 볼륨으로 지정될 마운트 포인트를 생성한다.

실제 연결은 -v <host_dir>:<container_dir> 옵션을 사용하여 컨테이너에 저장될 디렉토리를 호스트에 저장하도록 설정한다.



USER


USER daemon
cs


명령을 실행할 사용자 계정이나 UID 를 설정한다. USER 뒤에 오는 RUN, CMD, ENTRYPOINT에 적용된다.



WORKDIR


WORKDIR /path/to/workdir
cs


WORKDIR 뒤에 오는 RUN, CMD, ENTRYPOINT, ADD, COPY 의 명령이 실행될 디렉토리를 설정한다.

명확하게 항상 절대 경로를 사용하는 것이 좋다.

ARG 와 ENV 명령으로 동일한 이름을 정의한다면, ENV 값이 우선이다.



ARG


ARG <name>[=<default value>]
cs


docker build --build-arg <varname>=<value> 플래그를 사용하여 빌드시 사용자가 전달할 수 있는 변수를 정의한다.


FROM busybox
ARG user1
ARG buildno=1
...
cs


미리 정의된 ARG 변수들 (따로 정의할 필요없음)


- HTTP_PROXY

- http_proxy

- HTTPS_PROXY

- https_proxy

- FTP_PROXY

- ftp_proxy

- NO_PROXY

- no_proxy



ONBUILD


ONBUILD 명령은 Dockerfile 로 생성된 이미지를 베이스 이미지로 하는 자식 이미지로부터 생성되는 컨테이너에서 실행된다.

FROM, MAINTAINER, ONBUILD를 제외한 모든 Dockerfile 명령을 사용할 수 있다.

자식의 자식 이미지로는 상속되지 않는다.


[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
cs



STOPSIGNAL


STOPSIGNAL signal
cs


종료될 컨테이너에 보내질 호출 신호를 설정한다.

신호는 커널의 시스템 콜 테이블의 숫자 9 나 SIGNAME 인 SIGKILL 가 될 수 있다.



Docker cache


Docker 는 Dockerfile 에 지정된 순서로 이미지를 빌드할 때, 빌드 속도를 향상시키기 위해 캐시에서 기존 이미지를 재사용한다.

예로, RUN 명령에서 apt-get update 과 apt-get install 명령을 한 줄에 붙여 사용하지 않으면, apt-get update 명령이 변경되지 않았을 때 캐시에서 가져오므로, 그 뒤의 install 패키지들은 원하는 최신 버전을 사용할 수 없게 된다.

docker build 명령에서 --no-cache=true 옵션을 추가하거나 ADD 명령으로 캐시를 무효화할 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,