26

Tôi đã thấy rất nhiều ví dụ về cách tạo vùng chứa Docker cho ứng dụng Rails. Thông thường họ chạy một máy chủ đường ray và có một CMD chạy di chuyển/thiết lập sau đó sẽ trả về máy chủ Rails.Chạy di chuyển với Rails trong vùng chứa Docker với nhiều phiên bản vùng chứa

Nếu tôi đang tạo ra 5 trong số các vùng chứa này cùng một lúc, thì Rails sẽ xử lý nhiều quy trình cố gắng bắt đầu di chuyển như thế nào? Tôi có thể thấy Rails kiểm tra phiên bản giản đồ hiện trong nhật ký truy vấn chung (đó là một cơ sở dữ liệu MySQL):

SELECT `schema_migrations`.`version` FROM `schema_migrations` 

Nhưng tôi có thể nhìn thấy một tình trạng chủng tộc ở đây nếu điều này xảy ra cùng lúc on Rails trường hợp khác nhau.

Xem xét DDL không giao dịch trong MySQL và tôi không thấy bất kỳ khóa nào xảy ra trong nhật ký truy vấn chung trong khi chạy di chuyển (ngoại trừ giao dịch chuyển đổi), có vẻ như sẽ khởi động song song một ý tưởng tồi. Trong thực tế, nếu tôi khởi động ba lần cục bộ, tôi có thể thấy hai trường hợp đường ray bị lỗi khi cố gắng tạo bảng vì nó đã tồn tại trong khi trường hợp đường ray thứ ba hoàn thành việc di chuyển một cách vui vẻ. Nếu đây là một quá trình di chuyển đã chèn thứ gì đó vào cơ sở dữ liệu thì nó sẽ không an toàn. Có một ý tưởng tốt hơn để chạy một thùng chứa duy nhất chạy di chuyển/thiết lập sau đó sinh sản (ví dụ) một cá thể Unicorn mà đến lượt nó sinh ra nhiều công nhân đường ray không? Không.

Tôi có nên sinh ra các thùng chứa đường ray N và một 'vùng chứa di chuyển' chạy quá trình di chuyển rồi thoát không?

Có tùy chọn nào tốt hơn không?

+0

Điều này có vẻ có liên quan http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/ –

+0

@MaxWilliams từ giao diện Dockerfile của mình là một ví dụ tốt về cách vô tình gây ra vấn đề, nhưng không chứa giải pháp. Ví dụ của ông hoạt động tốt để thử nghiệm (nhưng có thể từ từ). Tôi không thể tin rằng tất cả mọi người đang chạy một máy chủ đường ray duy nhất trong sản xuất! –

+0

Hmm yeah bạn nói đúng, xin lỗi:/Chắc chắn không phải là trường hợp mọi người đang chạy một máy chủ rails duy nhất trong sản xuất! Ví dụ, chúng tôi có ba hộp, mỗi một amazon aws dụ, với một số thư mục được chia sẻ và mỗi chạy 12 mongrels, chúng tôi thực sự có 36 máy chủ đường ray trên 3 hộp. Chúng tôi không sử dụng docker tho :) –

Trả lời

6
docker run <container name> rake db:migrate 

Bắt đầu bạn chứa ứng dụng tiêu chuẩn nhưng không chạy CMD (rails server), nhưng rake db:migrate

UPDATE: đề nghị của La Mã, lệnh sẽ hiện là:

docker exec <container> rake db:migrate 
+0

Lệnh bây giờ sẽ là 'docker exec rake db: migrate'. – Roman

+4

Nếu tôi không nhầm, exec thực hiện một lệnh trong một container đang chạy. Vì vậy, bạn phải bắt đầu vùng chứa ứng dụng mà không cần di chuyển và áp dụng các di chuyển sau này. Điều này có thể gây ra vấn đề. Nó sẽ được sạch hơn nhiều để áp dụng các di chuyển đầu tiên (thông qua chạy) và bắt đầu container ứng dụng sau đó. Docker soạn có thể giúp đỡ ở đó. – brejoc

21

Đặc biệt với Rails tôi không có kinh nghiệm, nhưng chúng ta hãy nhìn từ một docker và quan điểm kỹ thuật phần mềm.

Nhóm Docker chủ trương, đôi khi khá tích cực, các vùng chứa đó là về các ứng dụng giao hàng. Trong this really great statement, Jerome Petazzoni nói rằng đó là tất cả về việc tách mối quan tâm. Tôi cảm thấy rằng đây chính là điểm bạn đã tìm ra.

Chạy vùng chứa đường ray bắt đầu di chuyển hoặc thiết lập có thể tốt cho việc triển khai ban đầu và có thể thường được yêu cầu trong quá trình phát triển. Tuy nhiên, khi đi vào sản xuất, bạn thực sự nên cân nhắc tách các mối quan tâm.

Vì vậy, tôi sẽ nói có một hình ảnh mà bạn sử dụng để chạy vùng chứa đường ray N và thêm công cụ/di chuyển/thiết lập bất kỳ vùng chứa nào mà bạn sử dụng để thực hiện các tác vụ quản trị. Hãy xem những gì các nhà phát triển từ số official rails image nói về điều này:

Nó được thiết kế để sử dụng như một thùng chứa (bỏ mã nguồn và bắt đầu thùng chứa để khởi động ứng dụng), cũng như cơ sở để xây dựng các hình ảnh khác tắt.

Khi bạn nhìn vào hình ảnh đó, không có lệnh thiết lập hoặc di chuyển. Nó hoàn toàn phụ thuộc vào người dùng cách sử dụng nó. Vì vậy, khi bạn cần chạy nhiều container chỉ cần đi trước.

Từ kinh nghiệm của tôi với mysql hoạt động tốt. Bạn có thể chạy một thùng chứa dữ liệu chỉ để lưu trữ dữ liệu, chạy một thùng chứa với máy chủ mysql và cuối cùng chạy một thùng chứa cho các tác vụ quản trị như sao lưu và khôi phục. Đối với tất cả ba vùng chứa, bạn có thể sử dụng cùng một hình ảnh. Giờ đây bạn có thể truy cập cơ sở dữ liệu của mình miễn phí từ một số vùng chứa Wordpress Wordpress. Điều này có nghĩa là chia tách mối quan tâm rõ ràng. Khi bạn sử dụng docker-compose không khó để quản lý tất cả các vùng chứa đó. Chắc chắn đã có nhiều thùng chứa và công cụ của bên thứ ba để hỗ trợ bạn thiết lập một ứng dụng phức tạp bao gồm một số thùng chứa.

Cuối cùng, bạn nên quyết định xem docker và kiến ​​trúc vi mô vi dịch vụ có phù hợp với sự cố của bạn hay không. Như được nêu trong this article có một số lý do để chống lại. Một trong những vấn đề cốt lõi là nó thêm một lớp phức tạp hoàn toàn mới. Tuy nhiên, đó là trường hợp với nhiều giải pháp và tôi đoán bạn nhận thức được điều này và sẵn sàng để ngoại trừ nó.

Các vấn đề liên quan