2015-11-24 25 views
4

我已经尝试了多种不同的方式,包括在每个任务定义文件在这里我的任务定义特权标志:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_security是否有可能在Amazon elasticbeanstalk上启动特权Docker容器?

我也曾在亚马逊这里找到论坛帖子过来:https://forums.aws.amazon.com/thread.jspa?threadID=180014&tstart=0&messageID=687696#687696在亚马逊员工“ChrisB @ AWS”说:“ECS现在支持特权模式。”

我已经在任务定义中使用上述特权键/ val在ECS上成功启动了特权容器,并且可以在ec2主机上使用docker命令进行确认。然而,相同的任务定义节在弹性beanstalk多容器解决方案堆栈主机上不能证明是成功的。我在亚马逊论坛上看到了一个〜年的旧帖子,专门讨论在elasticbeanstalk中的支持:https://forums.aws.amazon.com/thread.jspa?messageID=687694&#687694其中亚马逊员工“DhanviK @ AWS”说:“EB还没有干净地支持docker执行的特权模式。考虑到这一点,我们会继续发布Docker容器的下一个版本。“

我还在github上看到一些从github上的旧讨论:https://github.com/awslabs/eb-docker-virtual-hosting/issues/1他们说ECS不支持它。但是很显然,根据我上面的实验,它已经在这一点上实施了。

那么是什么给?如果EB多容器解决方案堆栈简单地包装ECS服务,为什么我的特权标记从elasticbeanstalk传递时不能被ecs代理接受? elasticbeanstalk是否简单地在标志到达ecs代理之前删除标志?如果这是怪人。任何人都可以对此有所了解吗?

更新:我发现这个问题属于单容器elasticbeanstalk解决方案堆栈。这不是我正在使用的。我正在使用多容器解决方案堆栈。 How can I run a Docker container in AWS Elastic Beanstalk with non-default run parameters?

回答

3

只是想出了如何解决这个问题,现在Elastic Beanstalk supports running a privileged containers,您只需将"privileged": "true"添加到您的Dockerrun.aws.json作为以下样品(请看container-1):

{ 
    "AWSEBDockerrunVersion": 2, 
    "containerDefinitions": [{ 
    "name": "container-0", 
    "image": "ubuntu", 
    "memory": "512" 
    }, { 
    "name": "container-1", 
    "image": "ubuntu", 
    "memory": "512", 
    "privileged": "true" 
    }] 
} 
8

原来,Elastic Beanstalk确实只是从任务定义中删除了特权标志。您可以通过将其包含在Dockerrun.aws.json文件中来确认此问题,该文件可以在您的应用程序包中上载到EB,然后在aws中进入ECS控制面板,并查看由EB为您的容器群集创建的任务定义。特权标志现在将被设置为false。这实际上是怪人。

为了解决这个问题,我不得不花费数小时的时间攻击一个等待部署来启动所有容器的ebextension,然后遍历Dockerrun.aws.json并提取任何应该是的容器定义然后执行docker检查这些容器的正在运行的非特权版本,然后使用docker检查中的现有运行配置停止并重新运行它们,但将特权标志设置为true。这里提供了ebextension的文件:https://gist.github.com/therealjessesanford/5a012218889831926169

注意:您不能在Dockerrun.aws.json文件的同一容器定义节中使用essential:true和特权:true。这两个参数与这个黑客相互排斥。

我还包括他们在这里内嵌Google员工:

.ebextensions/0001_restart_privileged_containers.config

container_commands: 
    01-move-restart-hook: 
    command: cp -f .ebextensions/files/00_restart_containers_with_privileges.sh /opt/elasticbeanstalk/hooks/appdeploy/post/00_restart_containers_with_privileges.sh && chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/post/00_restart_containers_with_privileges.sh 
    02-move-stop-hook: 
    command: cp -f .ebextensions/files/02stop_privileged_containers.sh /opt/elasticbeanstalk/hooks/appdeploy/pre/02stop_privileged_containers.sh && chmod 755 /opt/elasticbeanstalk/hooks/appdeploy/pre/02stop_privileged_containers.sh 

.ebextensions /文件/ 00_restart_containers_with_privileges。SH

#!/bin/bash 

set -ex 

. /opt/elasticbeanstalk/hooks/common.sh 

EB_CONFIG_APP_STAGING=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir) 
export DOCKERRUN_AWS_JSON=$EB_CONFIG_APP_STAGING/Dockerrun.aws.json 

while read -r container_short_name; do 
    CURRENT_CONTAINER_ID=$(docker ps --no-trunc -q --filter=name=.$container_short_name) 
    CONTAINER_LONG_NAME=$(docker inspect --format='{{.Name}}' $CURRENT_CONTAINER_ID) 
    CURRENT_CONFIG=$(docker inspect --format='{{json .Config}}' $CURRENT_CONTAINER_ID) 
    NEW_HOST_CONFIG=$(docker inspect --format='"HostConfig":{{json .HostConfig}}' $CURRENT_CONTAINER_ID | sed 's/\"Privileged\":false/\"Privileged\":true/I') 
    echo "Stopping unprivileged $CONTAINER_LONG_NAME" 
    docker stop $CURRENT_CONTAINER_ID 
    docker rm $CURRENT_CONTAINER_ID 
    NEW_CONTAINER_ID=$(curl --unix-socket /var/run/docker.sock -X POST -H "Content-Type: application/json" http:/containers/create?name=$CONTAINER_LONG_NAME -d "${CURRENT_CONFIG%?},$NEW_HOST_CONFIG}" | jq -r '.Id') 
    echo "Starting privileged $CONTAINER_LONG_NAME" 
    docker start $NEW_CONTAINER_ID 
    sed -i "s/$CURRENT_CONTAINER_ID/$NEW_CONTAINER_ID/g" /var/lib/ecs/data/ecs_agent_data.json 
done <<< "$(jq -r '.containerDefinitions[] | select(.privileged == true) | .name' $DOCKERRUN_AWS_JSON)" 

.ebextensions /文件/ 02stop_priviliged_containers.sh

#!/bin/bash 

set -ex 

. /opt/elasticbeanstalk/hooks/common.sh 

EB_CONFIG_APP_CURRENT=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir) 
export DOCKERRUN_AWS_JSON=$EB_CONFIG_APP_CURRENT/Dockerrun.aws.json 

while read -r container_short_name; do 
    CURRENT_CONTAINER_ID=$(docker ps -q --filter=name=.$container_short_name) 
    if [[ ! -z $CURRENT_CONTAINER_ID && "FOOBAR$CURRENT_CONTAINER_ID" != "FOOBAR" ]]; then 
    CONTAINER_LONG_NAME=$(docker inspect --format='{{.Name}}' $CURRENT_CONTAINER_ID) 
    echo "Stopping unprivileged $CONTAINER_LONG_NAME" 
    docker stop $CURRENT_CONTAINER_ID || true 
    docker rm $CURRENT_CONTAINER_ID || true 
    fi 
done <<< "$(jq -r '.containerDefinitions[] | select(.privileged == true) | .name' $DOCKERRUN_AWS_JSON)" 

./Dockerrun.aws.json

{ 
    "AWSEBDockerrunVersion": 2, 
    "containerDefinitions": [ 
    { 
     "name": "happy_container_name", 
     "image": "tutum.co/happy/happy_container", 
     "memory": 128, 
     "essential": false, 
     "privileged": true 
    } 
    ] 
} 
相关问题