Skip to content

Docker cho môi trường build

Đóng gói toolchain (Petalinux, Yocto, cross-compiler) vào container để mọi máy dev và CI dùng cùng một môi trường, tránh lỗi "máy tôi build được". Lệnh Docker cơ bản xem Docker.

Dockerfile mẫu

Ví dụ Dockerfile tối giản cho môi trường build kiểu Petalinux/Yocto. Danh sách gói chỉ mang tính minh họa, cần đối chiếu với tài liệu của phiên bản công cụ đang dùng (ví dụ UG1144 cho Petalinux).

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive

# Gộp apt update + install + dọn cache trong một layer
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential gawk gcc git make python3 \
        libncurses5-dev zlib1g-dev libssl-dev flex bison \
        texinfo autoconf libtool xterm screen pax gzip \
        locales sudo ca-certificates wget cpio file unzip \
    && locale-gen en_US.UTF-8 \
    && rm -rf /var/lib/apt/lists/*

ENV LANG=en_US.UTF-8

WORKDIR /work
CMD ["/bin/bash"]

Một vài lưu ý:

  • Đặt các lệnh ít thay đổi (cài gói) lên trước, lệnh hay thay đổi (copy source) xuống sau để tận dụng cache của layer.
  • Dùng .dockerignore để loại .git, thư mục build, file lớn khỏi build context, tránh docker build chậm vì phải gửi context.
  • Container chạy mặc định bằng root. Với môi trường build, cách đang dùng ở trên là chạy bằng -u $(id -u):$(id -g) để file tạo ra thuộc về user host. Công cụ như Petalinux/Yocto từ chối chạy bằng root nên đây cũng là lý do cần cách này.

Chạy container build

Lệnh build image (Build image) và script docker run mount $HOME, thư mục làm việc, chạy bằng user của host (Chạy container) nằm ở trang Docker.

Lưu ý riêng cho Yocto và Petalinux

  • BitBake và Petalinux từ chối chạy bằng root, nên container phải chạy bằng user thường (-u $(id -u):$(id -g)) hoặc tạo user trong image.
  • Cần locale UTF-8 (en_US.UTF-8) như trong Dockerfile ở trên, thiếu sẽ báo lỗi ngay khi bắt đầu.
  • Download cache (DL_DIR) và shared state cache (SSTATE_DIR) của Yocto rất lớn, nên đặt ở volume hoặc thư mục bind mount để giữ qua các lần xóa container, xem Volume và bind mount.
  • Đặt build tree trên bind mount của host thay vì trong lớp ghi của container để đĩa không bị phình và dữ liệu không mất khi xóa container.
  • Với CI, dùng image đã cố định tag phiên bản công cụ và đẩy lên registry (Docker Hub), tránh build lại image mỗi lần chạy.
  • Dùng --privileged và mount /dev chỉ khi cần truy cập thiết bị thật (ghi SD card, JTAG). Nó làm yếu cô lập, xem Container Internals.