6

Tôi có một hộp chứa Docker chạy tốt trên máy phát triển địa phương của tôi. Tôi muốn di chuyển số này đến AWS Elastic Beanstalk, nhưng tôi đang gặp phải một chút rắc rối.Làm cách nào để chạy vùng chứa Docker trong AWS Elastic Beanstalk với các tham số chạy không mặc định?

Tôi đang cố gắng gắn một thùng S3 vào vùng chứa của mình bằng cách sử dụng s3fs. Tôi có Dockerfile:

FROM tomcat:7.0 
MAINTAINER [email protected] 

RUN apt-get update 
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential libfuse-dev libcurl4-openssl-dev libxml++2.6-dev libssl-dev mime-support automake libtool wget tar 

# Add the java source 
ADD . /path/to/tomcat/webapps/ 
ADD run_docker.sh /root/run_docker.sh 
WORKDIR $CATALINA_HOME 

EXPOSE 8080 

CMD ["/root/run_docker.sh"] 

Và tôi cài đặt s3fs, gắn kết một xô S3, và chạy Tomcat máy chủ sau khi hình ảnh đã được tạo ra, bằng cách chạy run_docker.sh:

#!/bin/bash 
#run_docker.sh 

wget https://github.com/s3fs-fuse/s3fs-fuse/archive/master.zip -O /usr/src/master.zip; 
cd /usr/src/; 
unzip /usr/src/master.zip; 
cd /usr/src/s3fs-fuse-master; 
autoreconf --install; 
CPPFLAGS=-I/usr/include/libxml2/ /usr/src/s3fs-fuse-master/configure; 
make; 
make install; 
cd $CATALINA_HOME; 

mkdir /opt/s3-files; 
s3fs my-bucket /opt/s3-files; 
catalina.sh run 

Khi tôi xây dựng và chạy vùng chứa Docker này bằng cách sử dụng lệnh:

docker run --cap-add mknod --cap-add sys_admin --device=/dev/fuse -p 80:8080 -d username/mycontainer:latest 

hoạt động tốt. Tuy nhiên, khi tôi xóa --cap-add mknod --cap-add sys_admin --device=/dev/fuse, thì s3fs không thể gắn kết nhóm S3 của tôi.

Bây giờ, tôi muốn chạy này trên AWS đàn hồi Beanstalk, và khi tôi triển khai các container (và chạy run_docker.sh), tất cả các bước thực hiện tốt, ngoại trừ bước s3fs my-bucket /opt/s3-files trong run_docker.sh thất bại trong việc gắn kết xô .

Có lẽ, điều này là do bất kỳ Beanstalk đàn hồi nào để chạy vùng chứa Docker, nó không thêm bất kỳ cờ bổ sung nào như, --cap-add mknod --cap-add sys_admin --device=/dev/fuse.

tập tin Dockerrun.aws.json tôi trông như thế:

{ 
    "AWSEBDockerrunVersion": "1", 
    "Image": { 
    "Name": "tomcat:7.0" 
    }, 
    "Ports": [ 
    { 
     "ContainerPort": "8080" 
    } 
    ] 
} 

Có thể bổ sung thêm docker run cờ đến một triển khai AWS EB Docker? Một tùy chọn thay thế là tìm một cách khác để gắn kết một nhóm S3, nhưng tôi cho rằng tôi sẽ gặp phải các lỗi quyền tương tự bất kể. Có ai nhìn thấy bất kỳ cách nào để thực hiện điều này?

UPDATE:

Đối với những người cố gắng sử dụng @ Egor của câu trả lời dưới đây, nó hoạt động khi cấu hình EB được thiết lập để sử dụng v1.4.0 running Docker 1.6.0. Mọi thứ qua phiên bản v1.4.0 đều không thành công. Vì vậy, để làm cho nó hoạt động, xây dựng môi trường của bạn như bình thường (mà sẽ cung cấp cho bạn một xây dựng không thành công), sau đó xây dựng lại nó với một cấu hình v1.4.0 running Docker 1.6.0. Nên làm vậy!

+0

Làm thế nào bạn có thể xây dựng lại một môi trường bằng cách sử dụng '1.4.0 chạy Docker 1.6.0' cấu hình? Bàn điều khiển EB dường như không cung cấp tùy chọn này, cũng không phải tài liệu. – zerodot

Trả lời

4

Thêm tập tin .ebextensions/01-commands.config

container_commands: 
    00001-docker-privileged: command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh' 

Tôi cũng sử dụng s3fs

+0

Thú vị. '04run.sh' ở đây là gì? Điều đó có dành riêng cho môi trường/thiết lập của bạn không? Hoặc là docker 'run' bước chỉ đơn giản là bước 4 EB làm gì? – Brett

+0

https://gist.github.com/yurtaev/1e8d639cb03bbb95e71a#file-04run-sh là một tệp cụ thể cho EB –

+0

Đây là - * không may * - không hoạt động đối với tôi. Tôi thấy rằng '04run.sh' được sửa đổi và bao gồm cờ' --privileged', nhưng trạng thái nhật ký: 'fuse: failed to open/dev/fuse: Thao tác không được phép'. Bất kỳ ý tưởng? – Brett

7

Nếu bạn đang sử dụng phiên bản mới nhất của AWS Docker stack (Docker 1.7.1 chẳng hạn), bạn sẽ cần phải hơi sửa đổi câu trả lời ở trên.Hãy thử điều này:

commands: 
    00001_add_privileged: 
     cwd: /tmp 
     command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh' 

Thông báo thay đổi địa điểm & & tên của kịch bản chạy

+0

Tôi đã tự hỏi làm thế nào để làm điều này trong một thời gian dài, tuyệt vời. Trong trường hợp của tôi, tôi đã cố gắng chuyển arg đến một repo image docker công cộng, vì vậy tôi đã sử dụng lệnh ': sed -i" s/\ $ EB_CONFIG_DOCKER_IMAGE_STAGING/\ $ EB_CONFIG_DOCKER_IMAGE_STAGING -gzip -enable-url-source/"/ opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'' –

+0

Tuyệt vời. Vui mừng nó có thể giúp đỡ. –

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