Các cách build docker image cần biên dịch mã nguồn

Để sử dụng Docker, một việc cơ bản cần biết là build docker image.

  • Để build một image tối ưu bằng cách cài các gói có sẵn đã là “một việc không đơn giản.”
  • Để build một image tối ưu bằng cách compile program từ source code còn là một việc khó hơn!

1. Cách 1: Cài đặt tất cả trong một

Mô tả: Cài đặt đầy đủ phần mềm, kể cả các trình biên dịch và thư viện để compile source.

Ưu điểm:

  • Cài đặt đơn giản.
  • Build image nhanh vì sử dụng cơ chế cache layers.

Nhược điểm:

  • Kích thước image lớn.

2. Cách 2: Cài và xoá những phần không cần thiết trong một câu lệnh

Mô tả: Thực hiện cài đặt trình biên dịch và thư viện để compile mã nguồn. Sau đó remove trình biên dịch và thư viện.

Chú ý: Việc này cần thực hiện trong 1 câu lệnh trong Dockerfile. (Xem thêm phần docker layers: http://merrigrove.blogspot.com/2015/10/visualizing-docker-containers-and-images.html)

Ưu điểm:

  • Kích thước image nhỏ.

Nhược điểm:

  • Không sử dụng được cơ chế cache layers nên thời gian build docker image lâu.

Ví dụ:
Dockerfile: https://github.com/cuongtransc/docker-nginx/blob/master/Dockerfile#L22-L23

Script cài đặt chương trình từ source code:

  1. Cài đặt compiler.
  2. Cài đặt thư viện.
  3. Download source code.
  4. Compile program from source code.
  5. Remove những thành phần không cần thiết: file source code, compiler, thư viện dùng để biên dịch.

https://github.com/cuongtransc/docker-nginx/blob/master/build-nginx/build-nginx-ubuntu-16.04.sh

3. Cách 3: Biên dịch mã nguồn trước, đóng gói image sau.

Mô tả: Thực hiện biên dịch mã nguồn thành file đích, sau đó tiến hành đóng gói vào Docker Image. (Cách mới là cách 4)

Ưu điểm:

  • Build image nhanh vì sử dụng cơ chế cache layers.
  • Kích thước image nhỏ.

Nhược điểm:

  • Cách build phức tạp, nhiều bước.
  • Chỉ áp dụng được trong một số điều kiện nhất định. Ví dụ như program sau khi được compile có thể chạy độc lập, không cần thêm thư viện. Nếu không, khi build image, cần cài thêm các thư viện cho program. Trong nhiều trường hợp, việc này không đơn giản.

Ví dụ: Tạo container để compile ứng dụng java. Sau khi thu được file jar, thực hiện đóng gói vào docker image.

4. Cách 4: Multi Stage Dockerfile

Mô tả: Các bước thực hiện:

  1. Compile stage: Cài đặt các thư viện, biên dịch chương trình.
  2. Packing stage: Copy chương trình đã được biên dịch vào image đích.

Ưu điểm:

  • Sử dụng được caching ở phase build -> Tăng tốc độ build.
  • Chỉ đóng gói chương trình đã được biên dịch, không lấy các thư viện biên dịch -> Giảm kích thước image.

Ví dụhttps://github.com/cuongtransc/docker-training/blob/master/images/hello-c/Dockerfile

5. Tài liệu tham khảo

  1. Dockerfile: http://bit.ly/c-dockerfile
  2. Dockerize Best Practices: http://bit.ly/c-dockerize-best-practices
  3. Docker Image Template: http://bit.ly/c-docker-image-template
  4. Docker Training (todo): https://github.com/cuongtransc/docker-training
  5. Multi-stage Dockerfile for Golang Application: http://pliutau.com/multi-stage-dockerfile-for-golang-application/

 

The following two tabs change content below.