Thường hữu ích khi khởi động bộ chứa Docker chạy máy chủ cơ sở dữ liệu với cơ sở dữ liệu được xác định trước, sẵn sàng và được điền sẵn thông qua tập lệnh SQL, có thể sử dụng được ngay khi bộ chứa khởi động
Đây có thể là một phụ thuộc cho sự phát triển cục bộ, một phụ thuộc cho các bài kiểm tra, trong số những thứ khác
Đối với macOS. nếu không có thì cài MySQL với Homebrew để lấy MySQL client
brew install mysql
Để xác định vùng chứa, chúng tôi cần hai tệp trong cùng một thư mục. Dockerfile mở rộng mysql và chỉ định tập lệnh bắt đầu
Bạn thấy mình trong tình huống cần chạy một số tập lệnh hoặc thậm chí mã chuyên dụng từ bên trong ứng dụng của mình để thực hiện một số kiểm tra nhằm tương tác với bảng hoặc tạo và tạo cơ sở dữ liệu theo chương trình nếu một số dữ liệu hoặc lược đồ không có trong cơ sở dữ liệu của bạn
Theo tôi, đó là một vấn đề như
- cơ sở dữ liệu của bạn và ứng dụng của bạn trở nên gắn kết chặt chẽ
- bạn đang lãng phí thời gian quý báu để thiết lập những thứ đã nói ở trên
Thật không may, và điều này được đưa ra ý kiến công khai, sự kết hợp chặt chẽ này đã trở thành xu hướng chủ đạo với rất nhiều khung web cung cấp các hệ thống di chuyển dữ liệu mạnh mẽ
một giải pháp. sử dụng dịch vụ máy gieo hạt trong container
Ý tưởng là tạo một vùng chứa chỉ chạy một lần để khởi tạo db và sau đó chết để không được khởi động lại khi bạn thực hiện docker compose up
;
Hãy minh họa điều này
Đầu tiên, hãy viết một số SQL thực sự đơn giản để tạo một bảng nếu không tồn tại
CREATE TABLE IF NOT EXISTS `test_table` [
`test_field` varchar[255] DEFAULT NULL,
`test_field2` int[11] DEFAULT 0
] ENGINE=InnoDB;
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
bây giờ đến tệp docker-compose
của chúng tôi
volumes:
db-vol:
services:
# We have 3 services: the database, the db seeder, and phpmyadmin
db:
image: mysql:latest
container_name: db
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
MYSQL_DATABASE: test_db
restart: unless-stopped
volumes:
- db-vol:/var/lib/mysql
ports:
- "3306:3306"
db_seeder:
image: mysql:latest
volumes:
- ./db.sql:/db.sql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: "true"
entrypoint: [ "bash", "-c", "sleep 10 && mysql --user=root --host=db --port=3306 test_db