是否有可能在Amazon elasticbeanstalk上启动特权的Docker容器?

我已经尝试了许多不同的方法,在我的任务定义中包含特权标志,这是根据任务定义文档: http : //docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_security

我也在亚马逊网站上发现了论坛post: https ://forums.aws.amazon.com/thread.jspa?threadID=180014&tstart =0& messageID=687696#687696亚马逊员工“ChrisB @ AWS”说:“ECS现在支持特权模式“。

我已经在任务定义中使用上述特权键/ val在ECS上成功启动了特权容器,并且可以在ec2主机上使用docker命令进行确认。 但是,同一个任务定义节在弹性beanstalk多容器解决scheme堆栈主机上不能certificate是成功的。

我在亚马逊论坛上看到一个约为一年的旧post,具体是关于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多容器解决scheme栈只是简单地包装ECS服务,为什么从elasticbeanstalk传递的ecs代理不能接受我的特权标志? elasticbeanstalk是否简单地删除标志,然后才能到达ecs代理? 如果这是怪人。 任何人都可以解释这一点吗?

更新:我发现这个问题属于单容器elasticbeanstalk解决scheme堆栈。 这不是我正在使用的。 我正在使用多容器解决scheme堆栈。 我如何在AWS Elastic Beanstalk中使用非默认运行参数运行Docker容器?

只是想出了如何解决这个问题,现在Elastic Beanstalk支持运行一个特权容器 ,你只需要在你的Dockerrun.aws.json添加"privileged": "true" ,如下面的示例(请看一下container-1 ):

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

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

为了解决这个问题,我不得不花费数小时的时间来攻击ebextension,等待部署来启动所有的容器,然后在Dockerrun.aws.json上循环,并提取任何应该被授权的容器定义,然后执行一个docker工检查这些容器的正在运行的非特权版本,然后停止并重新运行他们使用他们现有的运行configuration从docker检查,但特权标志设置为真。 ebextension的文件在这里提供:github.com

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

我也将这些内容包括在内:

.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 } ] }