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ể.