13/11/2018, 08:43

Dockerfile Systax

Dockerfile có thể hình dung như một script dùng để build các image trong container. Dockerfile bao gồm các câu lệnh liên tiếp nhau được thực hiện tự động trên một image gốc để tạo ra một image mới. Dockerfile giúp đơn giản hóa tiến trình từ lúc bắt đầu đến khi kết thúc.

I Dockerfile là gì

 

Dockerfile có thể hình dung như một script dùng để build các image trong container.

Dockerfile bao gồm các câu lệnh liên tiếp nhau được thực hiện tự động trên một image gốc để tạo ra một image mới. Dockerfile giúp đơn giản hóa tiến trình từ lúc bắt đầu đến khi kết thúc.

                                               

II. Dockerfile Systax

 

# Comment

INSTRUCTION arguments

Các INSTRUCTION là các chỉ thị, được docker quy định. Khi khai báo, các bạn phải viết chữ in hoa. Các arguments là đoạn nội dung mà chỉ thị sẽ làm gì.

 

Ví dụ:

# Comment

RUN echo 'we are running some # of cool things'

Tài liệu có thể thay đổi hoặc cập nhật tại đây

https://docs.google.com/document/d/1QRokYCSQATyGyvkmzv4zUEKYLOmQd1HBOyZJ6cjMkGU/edit

                       

III Các INSTRUCTION trong Dockerfile

 

1 FROM

Dùng để chỉ ra image được build từ đâu (từ image gốc nào)

 

FROM ubuntu

 

hoặc có thể chỉ rõ tag của image gốc

 

FROM ubuntu14.04:lastest

 

2 RUN

Dùng để chạy một lệnh nào đó khi build image, ví dụ về một Dockerfile

 

FROM ubuntu

RUN apt-get update

RUN apt-get install curl –y

 

3 CMD

Lệnh CMD dùng để truyền một lệnh của Linux mỗi khi thực hiện khởi tạo một container từ image (image này được build từ Dockerfile)

 

Có các cách (trong docs nói có 3 cách) sử dụng lệnh CMD, ví dụ

 

#Cách 1

FROM ubuntu

RUN apt-get update

RUN apt-get install curl -y

CMD ["curl", "ipinfo.io"]

 

hoặc

 

#Cách 2

FROM ubuntu

RUN apt-get update

RUN apt-get install wget -y

CMD curl ifconfig.io

 

4 LABEL

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

 

Chỉ thị LABEL dùng để add các metadata vào image.

 

Ví dụ:

LABEL "com.example.vendor"="ACME Incorporated"

LABEL com.example.label-with-value="foo"

LABEL version="1.0"

LABEL description="This text illustrates \ that label-values can span multiple lines."

 

5 MAINTAINER

 

MAINTAINER <name>

 

Dùng để đặt tên giả của images.

 

Hoặc bạn có thể sử dụng

 

LABEL maintainer yourname@gmail.com

 

6 EXPOSE

 

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

Lệnh EXPOSE thông báo cho Docker rằng image sẽ lắng nghe trên các cổng được chỉ định khi chạy. Lưu ý là cái này chỉ để khai báo, chứ ko có chức năng nat port từ máy host vào container. Muốn nat port, thì phải sử dụng cờ -p (nat một vài port) hoặc -P (nat tất cả các port được khai báo trong EXPOSE) trong quá trình khởi tạo contrainer.

 

7. ENV

ENV <key> <value>

ENV <key>=<value> ...

Khai báo cáo biến giá trị môi trường. Khi run container từ image, các biến môi trường này vẫn có hiệu lực.

 

8 ADD

ADD has two forms:

ADD <src>... <dest>

ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

 

Chỉ thị ADD copy file, thư mục, remote files URL (src) và thêm chúng vào filesystem của image (dest)

src: có thể khai báo nhiều file, thư mục, có thể sử dụng các ký hiệu như *,?,...

dest phải là đường dẫn tuyệt đối hoặc có quan hệ với chỉ thị WORKDIR

Note: If your URL files are protected using authentication, you will need to use RUN wget, RUN curl or use another tool from within the container as the ADD instruction does not support authentication.

 

 

Các quy định:

The path must be inside the context of the build: Có nghĩa là phải nằm trong thư mục đang build (chứa dockerfiles).

If is a directory, the entire contents of the directory are copied, including filesystem metadata. The directory itself is not copied, just its contents.

If multiple resources are specified, either directly or due to the use of a wildcard, then must be a directory, and it must end with a slash /.

If does not end with a trailing slash, it will be considered a regular file and the contents of will be written at .

If doesn’t exist, it is created along with all missing directories in its path.

 

 

9. COPY

COPY <src>... <dest>

COPY ["<src>",... "<dest>"] (this form is required for paths containing whitespace)

Chỉ thị COPY, copy file, thư mục (src) và thêm chúng vào filesystem của container (dest).

Các lưu ý tương tự chỉ thị ADD.

 

10 ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)

ENTRYPOINT command param1 param2 (shell form)

Hai cái CMD và ENTRYPOINT có tác dụng tương tự nhau. Nếu một Dockerfile có cả CMD và ENTRYPOINT thì CMD sẽ thành param cho script ENTRYPOINT. Lý do người ta dùng ENTRYPOINT nhằm chuẩn bị các điều kiện setup như tạo user, mkdir, change owner... cần thiết để chạy service trong container.

 

11 VOLUME

VOLUME ["/data"]

mount thư mục từ máy host và container. Tương tự option -v khi tạo container.

Thư mục chưa volumes là /var/lib/docker/volumes/. Ứng với mỗi container sẽ có các thư mục con nằm trong thư mục này. Tìm thư mục chưa Volumes của container sad_euclid:

root@adk:/var/lib/docker/volumes# docker inspect sad_euclid | grep /var/lib/docker/volumes

               "Source": "/var/lib/docker/volumes/491a2a775a4cf02bbaca105ec25995008cc7adbc5511e054bb9c6

 

12 USER

 

USER daemon

Set username hoặc UID để chạy các lệnh RUN, CMD, ENTRYPOINT trong dockerfiles.

 

13 WORKDIR

 

WORKDIR /path/to/workdir

Chỉ thị WORKDIR dùng để đặt thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,...

 

14 ARG

 

ARG <name>[=<default value>]

Chỉ thị ARG dùng để định nghĩa các giá trị của biến được dùng trong quá trình build image (lệnh docker build --build-arg =).

biến ARG sẽ không bền vững như khi sử dụng ENV.

 

15 STOPSIGNAL

STOPSIGNAL signal

Gửi tín hiệu để container tắt đúng cách.

 

16 SHELL

SHELL ["executable", "parameters"]

Chỉ thị Shell cho phép các shell form khác có thể ghi đè shell mặc định.

Mặc định trên Linux là ["/bin/sh", "-c"] và Windows là ["cmd", "/S", "/C"].

Ví dụ:

 

FROM microsoft/windowsservercore

 

# Executed as cmd /S /C echo default

RUN echo default

 

# Executed as cmd /S /C powershell -command Write-Host default

RUN powershell -command Write-Host default

 

# Executed as powershell -command Write-Host hello

SHELL ["powershell", "-command"]

RUN Write-Host hello

 

# Executed as cmd /S /C echo hello

SHELL ["cmd", "/S"", "/C"]

RUN echo hello

 

17 ONBUILD

ONBUILD [INSTRUCTION]

Chỉ thị ONBUILD được khai báo trong base image. Và khi child image build image từ base image thì lệnh ONBUILD mới được thực thi.

Ví dụ + ref: http://container42.com/2014/02/06/docker-quicktip-3-onbuild/

 
Tổng kết
Tài liệu có thể thay đổi hoặc cập nhật thêm tại đây
https://docs.google.com/document/d/1QRokYCSQATyGyvkmzv4zUEKYLOmQd1HBOyZJ6cjMkGU/edit
0