Apple Silicon Chip và Docker

Những con chip ARM hiện đại của Apple có hiệu năng thực thi và hiệu quả năng lượng đáng nể. Nhưng trong giai đoạn hiện tại, với các lập trình viên, PHẦN LỚN ẢNH DOCKER họ dùng được build cho kiến trúc x86_64. Trên những chiếc mac M, ảnh docker được pull về sẽ là ảnh dành cho arch linux/arm64/v8. Điều này sẽ dẫn đến một số xung đột nhất định. Bài viết này sẽ hướng dẫn một số cách giải quyết vấn đề này.

Chạy các câu lệnh docker trên rosetta-terminal

Một trong những điều đầu tiên nên làm là cấu hình để thực thi các câu lệnh shell thông qua một terminal x86_64. Bằng cách nào?

Mở info của app Terminal (hoặc iTerm) và tick chọn vào Open using Rosetta.

Đối với terminal của IDE, chẳng hạn dưới đây là của các Jetbrains IDE, bổ sung biến môi trường để terminal của IDE được macos hiểu như một ứng dụng x86_64:

Thêm tuỳ chọn “–platform” khi thực thi docker cli

Điểm mấu chốt là chúng ta bổ sung tuỳ chọn --flatform linux/amd64 khi thực thi các câu lệnh docker. Chẳng hạn như dưới đây:

docker run -d \
    --platform linux/amd64 \
    -v todo-mysql-data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=secret \
    -e MYSQL_DATABASE=todos \
    mysql:5.7

Trong docker compose, platform được khai báo như sau:

services:  
  db:  
    platform: linux/amd64
    image: mysql:5.7

Kể từ docker v19.03.0 (tháng 3/2019), chúng ta cũng có thể setup sẵn platform cho shell session thông qua biến môi trường:

export DOCKER_DEFAULT_PLATFORM=linux/amd64

Cũng có thể đặt biến môi trường cho chỉ một câu lệnh:

DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build

Hay đặt biến môi trường thông qua file docker compose:

services:
  service_name:
    environment:
      - DOCKER_DEFAULT_PLATFORM=linux/amd64

Tất nhiên, bạn cũng có thể set sẵn thông qua .bashrc hay .zshrc. Go on.

Nếu muốn go hard-core, bạn có thể áp dụng phương án đặt alias:

alias docker='/usr/local/bin/docker --platform linux/amd64 '

Hay shell function:

docker() {
  if [[ `uname -m` == "arm64" ]] && [[ "$1" == "run" || "$1" == "build" ]];
  then
    /usr/local/bin/docker "$1" --platform linux/amd64 "${@:2}"
  else
    /usr/local/bin/docker "$@"
  fi
}

Dù bằng phương án nào, kết quả của những hành động trên là ảnh của arch x86_64 sẽ được pull, thay vì ảnh arm.

Sử dụng MariaDB

Một trong những ảnh gặp phải phiền toái về arch nhiều nhất là ảnh MySQL. Để đơn giản, chúng ta có thể sử dụng MariaDB nếu có thể.

 88 total views,  4 views today

Leave a Reply

Your email address will not be published.