Tạo cơ sở dữ liệu mysql docker-compose

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 

Chủ Đề