6

Tôi có một ứng dụng Dockerfile/elastic-beanstalk trong một repo git mà kéo một tarball của phiên bản hiện tại của ứng dụng từ s3 và khởi chạy nó. Điều này làm việc tuyệt vời lần đầu tiên tôi triển khai; các Docker container được xây dựng, và các ứng dụng khởi chạy và chạy một cách chính xác. Sự cố xảy ra sau khi tôi thực hiện thay đổi đối với ứng dụng, tải lại tarball lên s3 và chạy eb deploy.đàn hồi-cây đậu ứng dụng Docker không cập nhật khi triển khai

$ eb deploy 
INFO: Environment update is starting. 
INFO: Deploying new version to instance(s). 
INFO: Successfully built aws_beanstalk/staging-app 
INFO: Successfully pulled yadayada/blahblah:latest 
INFO: Docker container 06608fa37b2c is running aws_beanstalk/current-app. 
INFO: New application version was deployed to running EC2 instances. 
INFO: Environment update completed successfully. 

Nhưng ứng dụng chưa được cập nhật trên *.elasticbeanstalk.com. Tôi đoán vì Dockerfile không thay đổi, docker không xây dựng lại vùng chứa (và kéo tarball ứng dụng mới nhất). Tôi muốn có thể bắt buộc xây dựng lại nhưng công cụ eb dường như không có tùy chọn đó. Tôi có thể buộc xây dựng lại từ bảng điều khiển trang web, nhưng rõ ràng là không tốt cho tự động hóa. Tôi cam kết mỗi thay đổi cho git và tôi hy vọng rằng eb sẽ sử dụng điều đó để biết rằng việc xây dựng lại là cần thiết nhưng điều đó dường như không tạo ra bất kỳ sự khác biệt nào. Tôi có sử dụng docker/bean-beanstalk không đúng cách không? Lý tưởng nhất là tôi muốn cam kết git và có beanstalk tự động cài đặt lại ứng dụng.

Trả lời

0

Tôi tự hỏi nếu bạn có thể thử sử dụng đầu vào dữ liệu người dùng khi bạn xác định các trường hợp của bạn trong cây đậu? Một cái gì đó như thế này có thể bắn ra ngay ở phần cuối của khởi động:

#!/bin/bash 
cd /app/dir/home 
sudo docker pull username/container 
... other things you may need to do ... 

hơn mà bạn có thể tham khảo về các kịch bản sử dụng dữ liệu và thực thi: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

+0

Dường như cây đậu không hỗ trợ dữ liệu người dùng - ít nhất theo [this] (http://stackoverflow.com/questions/8412231/how-do-i-pass-userdata-to-a-beanstalk -instance-with-cloudformation) và [this] (https://forums.aws.amazon.com/thread.jspa?threadID=81687). –

5

Vấn đề với việc sử dụng Docker cho CI là nó doesn không hành động như một kịch bản ở chỗ nó sẽ không xây dựng lại trừ khi các thay đổi Dockerfile. Vì vậy, bạn phải đặt những thứ cần phải được xây dựng lại mỗi lần trong một kịch bản trình bao bọc khởi động thay vì trong Dockerfile. Vì vậy, tôi đã di chuyển phần tải xuống ứng dụng tarball vào một tập lệnh mà Dockerfile cài đặt vào vùng chứa. Sau đó, khi container bắt đầu tarball được tải về và giải nén và chỉ sau đó có thể ứng dụng thực sự bắt đầu. Điều này hoạt động và tái triển khai hiện đang hoạt động như mong đợi. Của nó một chút trầm trọng hơn để gỡ lỗi quá trình và dẫn tôi đến ý kiến ​​rằng bằng cách sử dụng Docker với EB cho CI là một chút của một hack.

+1

Tôi có cùng một vấn đề. Triển khai lại ứng dụng web của tôi nhưng ứng dụng chưa được cập nhật. Bạn có thể cung cấp chính xác hơn về cách bạn khắc phục điều đó không? Hiện tại, Dockerfile của tôi gọi kịch bản .sh chạy máy chủ web của tôi –

0

Bạn nên có lẽ read this first để có được một sự hiểu biết tốt hơn về những gì chúng tôi sắp có trang web địa phương của chúng tôi trong kho git địa phương của chúng tôi và how to push it lên đến ElasticBeanstalk để làm cho trang web sống.

Tìm hoặc Tạo thư mục trong thư mục gốc của trang web của chúng tôi được gọi là .elasticbeanstalk.
Bên trong thư mục mà chúng ta sẽ thực hiện hai tập tin:

cấu hình

[global] 
ApplicationName=YourApplicationNameFromAWSConsole 
AwsCredentialFile=.elasticbeanstalk/aws_credentials 
DevToolsEndpoint=git.elasticbeanstalk.us-east-1.amazonaws.com 
EnvironmentName=EnvironmentNameFromAWSConsole 
Region=us-east-1 

aws_credentials

[global] 
AWSAccessKeyId=AKIAxxxxxxxxxxxxxxxxxxxxx 
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

Thay vì sử dụng eb deploygit aws.push thêm và cam kết tất cả mọi thứ để ElasticBeanstalk

git add *.* 
git commit -m "Adding AWS Configs" 
git aws.push 
0

TLDR: Bạn có thể đang sử dụng ContainerDirectory không có HostDirectory hoặc bạn có thể cần cập nhật 03build.sh để xây dựng với cờ --no-cache = true.

Sau một vài giờ sau, tôi cuối cùng đã khắc phục điều này với trường hợp sử dụng của tôi. Tôi đang sử dụng CodePipeline để chạy CodeCommit, CodeBuild và Elastic Beanstalk để tạo giải pháp phân phối liên tục/liên tục trong AWS với docker. Vấn đề tôi gặp phải là CodeBuild đã xây dựng thành công và xuất bản hình ảnh docker mới lên AWS ECR (đăng ký container EC2) và EBS đã kéo đúng hình ảnh mới, nhưng hình ảnh docker chưa bao giờ được cập nhật trên máy chủ.

Sau khi kiểm tra toàn bộ quá trình cách EBS xây dựng hình ảnh docker (có một bài viết thực sự tuyệt vời here, part 1here part 2 cung cấp tổng quan), tôi đã phát hiện sự cố.

Để thêm vào bài viết, có một quy trình 3 giai đoạn trong EBS trên các phiên bản EC2 được tách ra để triển khai hình ảnh đế.

  1. trước
  2. ban hành
  3. bài

quá trình 3 giai đoạn này là một chuỗi các file bash được thực thi mà được đặt tại /opt/elasticbeanstalk/hooks/appdeploy/.

The pre-giai đoạn chứa các kịch bản shell sau:

  1. 00clean_dir.sh - Dọn dẹp thư mục nguồn sẽ được tải về, loại bỏ các thùng chứa Docker và hình ảnh (ví dụ như dọn dẹp)
  2. 01unzip.sh - Downloads nguồn từ S3 và giải nén nó
  3. 02loopback-check.sh - Xác minh bạn không có thiết lập đặt vòng lặp docker
  4. 03build.sh - Đây là điều kỳ diệu xảy ra khi EC2 sẽ tạo hình ảnh đế từ Dockerfile hoặc Dockerrun của bạn. aws.json. Sau khi thử nghiệm nhiều, tôi nhận ra kịch bản xây dựng này đã được xây dựng hình ảnh cập nhật của tôi, nhưng tôi đã sửa đổi kịch bản này để bao gồm cờ --no-cache trên docker xây dựng là tốt.

Giai đoạn ban đầu là nơi xảy ra sự cố lưu vào bộ nhớ cache của tôi. Giai đoạn ban hành bao gồm:

  1. 00run.sh - đây là nơi mà Docker chạy được thực hiện đối với các hình ảnh đó được tạo ra trong giai đoạn tiền dựa trên các biến môi trường và các thiết lập trong Dockerrun.aws.json của bạn.Đây là những gì đã gây ra vấn đề bộ nhớ đệm cho tôi.
  2. 01flip.sh - Chuyển đổi từ AWS-dàn để hiện ứng dụng và rất nhiều thứ khác

Khi tôi sẽ thực hiện Docker chạy từ hình ảnh đó được tạo ra trong giai đoạn Pre, 03build.sh, tôi sẽ xem các thay đổi đã cập nhật của tôi. Tuy nhiên, khi tôi thực thi kịch bản lệnh shell 00run.sh, các thay đổi cũ sẽ xuất hiện. Sau khi điều tra lệnh Docker chạy, nó được thực hiện

`Docker command: docker run -d -v null:/usr/share/nginx/html/ -v /var/log/eb-docker/containers/eb-current-app:/var/log/nginx ca491178d076` 

Các -v null:/usr/share/nginx/html/ là những gì đã phá vỡ nó và làm cho nó không cập nhật. Điều này là do tệp Dockerrun.aws.json của tôi có

"Volumes": [ 
    { 
     "ContainerDirectory": "/usr/share/nginx/html/" 
    } 
    ], 

không có vị trí lưu trữ được tham chiếu. Kết quả là, mọi thay đổi trong tương lai tôi đã thực hiện, đều không được cập nhật.

Đối với giải pháp của mình, tôi vừa xóa mảng "Volumes" vì tất cả các tệp của tôi đều có trong hình ảnh docker tôi tải lên ECR. Lưu ý: Bạn có thể cần phải thêm --no-cache vào 03build.sh.

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