Tìm hiểu về Dockerfile để build Docker Image

1324

Tìm hiểu về Dockerfile dùng để build Docker ImageCuongquach.com | Bạn đang tìm hiểu cách thức để build các Docker Image dành riêng cho các mục đích ứng dụng hoá đem lên Container chạy. Vậy thì ngoài việc tìm hiểu cách thức build docker image, thì bạn cũng phải tham khảo và tìm hiểu về Dockerfile, một trong những thành phần quan trọng của quá trình build docker Image. Cùng tìm hiểu về Dockerfile nhé !

tìm hiểu về dockerfile

Có thể bạn quan tâm chủ đề khác
Container Registry là gì ?
Sự khác nhau giữa Docker Registry và Docker Repository
Docker Hub là gì ?
Cài đặt Docker trên CentOS 7

Dockerfile là gì ?

Docker sẽ xây dựng (build) docker image một cách tự động bằng cách đọc các chỉ thị (instruction) đã được khai báo trong một file có tên là Dockerfile. Dockerfile là một file văn bản chứa toàn bộ các chỉ thị lệnh mà người dùng muốn thực thi để tạo ra một Docker Image.

Ở bài viết này không hướng dẫn bạn cách thức build một Docker Image, mà chỉ nói về danh sách chỉ thị (instruction) do Docker quy định được sử dụng trong một Dockerfile. Thực tế thì khi build Docker Image thường sẽ dùng lệnh :

Trình build docker image sẽ đọc nội dung file văn bản Dockerfile và gửi nội dung đó đến dịch vụ Docker đang chạy. Kế đến Docker sẽ chạy các chỉ thị trong Dockerfile từng dòng một, commit các kết quả của từng chỉ thị thành các lớp layer của image.

Như vậy, Dockerfile giúp ta đơn giản hoá và tự động hoá việc xây dựng một Docker Image.

Cú pháp Dockerfile

  • 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ì.
  • Một Dockerfile phải bắt đầu bằng chỉ thị ‘FROM‘ để khai báo base image nào sẽ được sử dụng để làm nền tảng xây dựng image của riêng bạn.

Ví dụ:
– Một file Dockerfile dùng để build Docker Image ứng dụng Apache PHP.

Các chỉ thị (instruction) trong Dockerfile

Giờ bạn sẽ đến với danh sách các chỉ thị (instruction) được Docker quy định cho phép sử dụng trong file Dockerfile dùng để build Docker Image.

FROM

Cú pháp:

Chỉ thị FROM dùng cho quá trình khởi tạo xây dựng một Docker Image mới và dùng để chỉ ra image gốc nào sẽ là cơ sở để build image thực hiện các chỉ thị kế tiếp. Như vậy, một Dockerfile hợp lệ thường phải bắt đầu bằng chỉ thị FROM . Các base image sẽ có thể được tải về từ Public Repository hoặc Private Repository riêng của người dùng setup.

Các giá trị thẻ (tag) hoặc digest là tùy chọn. Nếu bạn bỏ qua một trong số chúng, thì thẻ được sử dụng mặc định sẽ là ‘latest‘.

Ví dụ :

hoặc

RUN

Cú pháp:

Chỉ thị RUN dùng để chạy một lệnh bất kì trên lớp layer mới của Docker Image và commit kết quả của lệnh đó khi build image. Ví dụ như bạn chạy lệnh để cài đặt các gói chương trình, package,.. thì kết quả việc cài đặt sẽ gồm các chương trình được cài vào lớp layer mới trong  docker image. Bạn có thể thực hiện nhiều lệnh cùng lúc ở cách thức ‘shell form‘ khi sử dụng chỉ thị RUN với dấu ‘\‘.

Ví dụ:

hoặc

CMD

Cú pháp:

Chỉ thị CMD được sử dụng để cung cấp câu lệnh mặc định sẽ được chạy khi Docker Container khởi động từ Image đã build, chỉ có thể có duy nhất 1 chỉ thị CMD trong một. Có 3 cách thức sử dụng lệnh CMD:

  • Sử dụng ở hình thức ‘exec form‘ với các tham số truyền vào.
  • Sử dụng ở hình thức ‘shell form‘ như bình thường.
  • Sử dụng ở hình thức truyền tham số cho chỉ thị ENTRYPOINT.

Khi sử dụng CMD ở ‘shell‘ hoặc ‘exec‘ form thì lệnh chỉ thị CMD sẽ được thực thi khi khởi chạy Container Docker. Vậy có khác gì so với chỉ thị lệnh RUN ? RUN chạy lệnh và commit kết quả của lệnh trong quá trình build image. CMD không thực thi câu lệnh ở quá trình build image, mà sẽ thực thi trong quá trình chạy Docker Container từ Image đó.

Để chi tiết hơn về CMDENTRYPOINT, chúng ta sẽ có bài viết khác.

Ví dụ :
– Cách 1 không sử dụng shell .

– Cách 2 với shell.

ENTRYPOINT

Cú pháp:

Hai cái CMDENTRYPOINT có tác dụng tương tự nhau. Nếu một Dockerfile có cả CMDENTRYPOINT 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.

SHELL

Cú pháp:

  • 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”].

ENV

Cú pháp:

Chỉ thị ENV dùng để khai báo biến môi trường tên <key> với giá trị <value>. Giá trị biến môi trường này sẽ hiện hữu cho các chỉ thị kế tiếp trong quá trình build Docker Image từ Dockerfile. Ngay cả khi chạy container từ Docker Image đã build có khai báo ENV thì container đó cũng sẽ hiện hữu biến môi trường ENV đã set.

Ví dụ:

Bạn cũng có thể thay đổi giá trị biến môi trường từ câu lệnh khởi động container.

LABEL

Cú pháp:

Chỉ thị LABEL dùng để thêm các thông tin metadata vào Docker Image khi được build. Một Image có thể có nhiều nhãn (label) thông tin metadata. Bạn có thể khai báo các metadata theo từng dòng chỉ thị LABEL hoặc nhiều metadata cho Image trên cùng một dòng chỉ thị LABEL.

Ví dụ :

Để xem thông tin label của Docker Image, bạn có thể dùng lệnh : # docker inspect

USER

Cú pháp:

Chỉ thị USER dùng để khai báo thông tin username hoặc UUID/GUID sử dụng khi chạy image và cũng là user dùng để chạy các lệnh chỉ thị khác như :RUN, CMD ENTRYPOINT .

WORKDIR

Cú pháp:

Chỉ thị WORKDIR dùng để khai báo thư mục làm việc cho các lệnh chỉ thị: RUN, CMD, ENTRYPOINT, COPY ADD . Nếu thư mục WORKDIR không tồn tại thì sẽ được tự động tạo.

Ví dụ:

Output của lệnh ‘pwd’ trong Dockerfile sẽ là ‘/a/b/c‘.

EXPOSE

Cú pháp:

Ví dụ:

Chỉ thị EXPOSE sẽ khai báo với Docker rằng container sử dụng Docker Image có khai báo EXPOSE sẽ lắng nghe kết nối trên các cổng được chỉ định khi khởi chạy. Bạn có thể chỉ định cổng lắng nghe theo giao thức TCP hoặc UDP, mặc định nếu không chỉ định cụ thể thì sẽ là TCP.

Chỉ thị EXPOSE không có chức năng nat port từ máy chủ host vào container, mà chỉ dùng để giúp người build Docker Image và người sử dụng Docker Image để chạy Container có thông tin về dịch vụ sẽ lắng nghe trên cổng nào. Như một dạng tài liệu giúp lưu ý với nhau ấy mà.

Còn nếu muốn thực sự nat port thì lưu ý đến phần Docker Network, có thể dùng các option như ‘-p‘ để chỉ định nat port cụ thể cho quá trình khởi chạy container.

VOLUME

Cú pháp:

  • 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 example_cuongqc:

Phần này có thể tìm hiểu kĩ hơn ở phần Docker Storage/Volume.

ADD

Cú pháp:

Chỉ thị ADD sẽ copy file, thư mục từ vị trí thư mục đang build trên local client hoặc remote files URL (src) và thêm chúng vào filesystem của image (dest). Trong đó cần lưu ý :

  • src‘ có thể khai báo nhiều file, thư mục, có thể sử dụng các ký hiệu wildcard như *,?,…
  • dest‘ phải là đường dẫn tuyệt đối hoặc có quan hệ với chỉ thị WORKDIR.

Ví dụ:

Bạn cũng có thể phân quyền user cho các file, thư mục mới được copy vào container filesystem.

Tất cả file mới, thư mục mới tạo sẽ có UID và GID là 0. Nếu container tập tin hệ thống root không có file /etc/passwd /etc/group thì ngay cả khi bạn có truyền thông tin user/group owner cũng sẽ khiến quá trình build image thất bại.

Ví dụ:

COPY

Cú pháp:

Chỉ thị COPY sẽ copy file, thư mục (src) và thêm chúng vào filesystem của container (dest). Khác với chỉ thị ADD thì COPY không hỗ trợ download các remote file URL từ nguồn web. Các lưu ý còn lại thì tương tự chỉ thị ADD.

ARG

Cú pháp:

Chỉ thị ARG dùng để khai báo biến mà user có thể truyền vào cho trình build image ở khi thực hiện quá trình build Docker Image. Thường khi truyền vào sẽ sử dụng option ‘–build-arg <varname>=<value>‘ kèm lệnh docker build. Nếu mà người dùng truyền vào biến nhưng không được khai báo trong Dockerfile sẽ gặp phải thông báo lỗi.

Một Dockerfile có thể bao gồm một hoặc nhiều chỉ thị ARG.

Bạn có thể khai báo giá trị mặc định cho biến trong trường hợp nếu chúng ta không truyền tham số biến từ ngoài vào thì ARG trong Dockerfile sẽ giúp trình build image hiểu giá trị mặc định nên sử dụng của biến đó.

Nếu bạn sử dụng chỉ thị ARG ENV để khai báo cùng giá trị cho 1 tên biến thì giá trị của chỉ thị ENV sẽ chép đè thông tin lên biến do chỉ thị ARG khai báo. Biến ARG cũng sẽ không bền vững như sử dụng biến chỉ thị ENV.

STOPSIGNAL

Cú pháp:

Khi mà bạn dừng một Docker Container bằng lệnh “docker stop” thì Docker sẽ gửi tín hiệu SIGTERM SIGKILL để tắt các tiến trình trong Docker Container. Thì với chỉ thị STOPSIGNAL bạn được phép cấu hình lại tín hiệu sẽ được gửi tới Docker Container khi nó được yêu cầu dừng hoạt động.

ONBUILD

Cú pháp:

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.

Nguồn: https://cuongquach.com/

LEAVE A REPLY