Điểm vào cho vùng chứa đế cho biết trình điều khiển docker sẽ chạy gì khi bạn muốn "chạy" vùng chứa cụ thể đó. Hãy đặt câu hỏi "những gì các container nên chạy khi nó bắt đầu lần thứ hai?" hoặc "vùng chứa sẽ chạy sau khi được khởi động lại?"
Có thể, những gì bạn đang làm là tuân theo cùng một phương pháp bạn thực hiện với cơ chế cấp phép "trường học cũ". Kịch bản của bạn là "cài đặt" các kịch bản cần thiết và bạn sẽ chạy ứng dụng của bạn như một dịch vụ systemd/upstart, phải không? Nếu bạn đang làm điều đó, bạn nên thay đổi điều đó thành định nghĩa "dockerized" hơn.
Điểm vào cho vùng chứa đó phải là tập lệnh thực sự khởi chạy ứng dụng của bạn thay vì thiết lập mọi thứ. Giả sử bạn cần cài đặt java để có thể chạy ứng dụng của bạn. Vì vậy, trong dockerfile bạn thiết lập các thùng chứa cơ sở để cài đặt tất cả những điều bạn cần như:
FROM alpine:edge
RUN apk --update upgrade && apk add openjdk8-jre-base
RUN mkdir -p /opt/your_app/ && adduser -HD userapp
ADD target/your_app.jar /opt/your_app/your-app.jar
ADD scripts/init.sh /opt/your_app/init.sh
USER userapp
EXPOSE 8081
CMD ["/bin/bash", "/opt/your_app/init.sh"]
container của chúng tôi, tại công ty tôi làm việc cho, trước khi chạy ứng dụng thực tế trong kịch bản init.sh họ lấy cấu hình từ lãnh sự (thay vì cung cấp một điểm gắn kết và đặt các cấu hình bên trong máy chủ hoặc nhúng chúng vào trong vùng chứa). Vì vậy, kịch bản sẽ giống như thế:
#!/bin/bash
echo "Downloading config from consul..."
confd -onetime -backend consul -node $CONSUL_URL -prefix /cfgs/$CONSUL_APP/$CONSUL_ENV_NAME
echo "Launching your-app..."
java -jar /opt/your_app/your-app.jar
Một lời khuyên tôi có thể cung cấp cho bạn là (trong kinh nghiệm thực sự ngắn của tôi làm việc với các container) đối xử với container của bạn như thể họ không quốc tịch khi họ đang được cung cấp (tất cả các lệnh bạn chạy trước điểm vào).
Nguồn
2016-06-15 13:39:58
Hoàn toàn đồng ý về việc xem xét các vùng chứa không quốc tịch. Nếu có dữ liệu để khởi tạo, hãy đặt nó trong một ổ đĩa. – BMitch
Tôi thực sự muốn làm theo lời khuyên của bạn, nhưng nó không phải là dễ dàng. Tôi có rất ít ảnh hưởng đến những thay đổi của ứng dụng và đã có thay đổi rất nhiều để sử dụng nó theo cách bạn mô tả. Ví dụ: mỗi khi vùng chứa bắt đầu, tập lệnh init sẽ thiết lập cơ sở dữ liệu cho ứng dụng. Điều này không nên xảy ra khi container được khởi động lại, vì nó ghi đè dữ liệu đã có ở đó ... Thật không may là nó được chứng minh là rất khó để dạy cho các nhà phát triển ứng dụng cách sử dụng docker. Vì vậy, tôi đang cố gắng để giữ cho nó cực kỳ đơn giản cho họ. – christian
làm thế nào để bạn chạy điều này? – StarWind0