Go

Docker & Containerization

Dockerfile, multi-stage build, tối ưu hóa image, docker-compose, điều phối container

20 câu hỏi phỏng vấn·
Senior
1

Lý do chính để sử dụng multi-stage build cho một ứng dụng Go là gì?

Câu trả lời

Multi-stage build tách môi trường biên dịch khỏi image cuối cùng. Stage build chứa toàn bộ Go SDK (vài trăm MB), trong khi image cuối cùng chỉ chứa binary đã biên dịch. Điều này giảm đáng kể kích thước image (từ ~800MB xuống còn vài MB) và giảm thiểu bề mặt tấn công bằng cách loại bỏ các build tool không cần thiết trong môi trường production.

2

Base image nào được khuyến nghị cho ứng dụng Go trong production để giảm thiểu kích thước và bề mặt tấn công?

Câu trả lời

Image scratch là một image rỗng không có hệ điều hành. Go biên dịch thành các binary tĩnh không cần libc hay các phụ thuộc hệ thống khác, nên có thể dùng scratch. Điều này tạo ra image nhỏ nhất có thể (vài MB) và mang lại bảo mật tốt nhất vì không có công cụ hay shell nào có thể bị khai thác. Distroless và alpine là các lựa chọn thay thế hợp lệ nhưng kém tối ưu hơn.

3

Những flag biên dịch Go nào cần thiết để tạo một binary tương thích với image scratch?

Câu trả lời

CGO_ENABLED=0 vô hiệu hóa cgo, buộc Go sử dụng các triển khai thuần Go cho các package như net và os/user. Nếu không có nó, binary sẽ có các phụ thuộc động vào libc. GOOS và GOARCH chỉ định nền tảng đích. Sự kết hợp các flag này tạo ra một binary hoàn toàn tĩnh không có phụ thuộc bên ngoài, lý tưởng cho scratch.

4

Làm thế nào để tối ưu hóa caching layer Docker khi build một ứng dụng Go?

5

Lợi ích của việc sử dụng image Google Distroless cho Go so với scratch là gì?

+17 câu hỏi phỏng vấn

Nắm vững Go cho lần phỏng vấn tiếp theo

Truy cập tất cả câu hỏi, flashcards, bài kiểm tra kỹ thuật, bài tập code review và mô phỏng phỏng vấn.

Bắt đầu miễn phí