当前位置: 首页 > 知识库问答 >
问题:

有可能在Amazon elasticbeanstalk上启动特权docker容器吗?

阎知
2023-03-14

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

我还在亚马逊找到了论坛帖子:https://forums.aws.amazon.com/thread.jspa?threadID=180014

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

我在亚马逊论坛上看到一个~年前的帖子,特别是关于elasticbeanstalk的支持:https://forums.aws.amazon.com/thread.jspa?messageID=687694

我还在github上看到一些去年4月的旧讨论:https://github . com/aw slabs/e b-docker-virtual-hosting/issues/1,他们说ECS不支持它。但是很明显,根据我上面的实验,这一点已经实现了。

那么是什么造成的呢?如果EB多conatiner解决方案堆栈只是包装ECS服务,为什么我的特权标志在从elasticbeanstek传递时不能被ecs代理接受?elasticbeanstek只是在它到达ecs代理之前删除标志吗?如果是这样,那就太奇怪了。有人能解释一下吗?

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

共有2个答案

云洋
2023-03-14

刚刚想出如何解决这个问题,现在Elastic Beanstek支持运行特权容器,您只需要将“特权”:“true”添加到您的Dockerrun.aws.json作为以下示例(请查看容器-1):

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [{
    "name": "container-0",
    "image": "ubuntu",
    "memory": "512"
  }, {
    "name": "container-1",
    "image": "ubuntu",
    "memory": "512",
    "privileged": "true"
  }]
}
欧阳学真
2023-03-14

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

为了解决这个问题,我不得不花很多时间将一个 ebextension 拼凑在一起,等待部署来启动所有容器,然后循环访问 Dockerrun.aws.json 并提取任何应该具有特权的容器定义,然后对这些容器的运行非特权版本执行 docker 检查,然后停止并使用 docker inspect 的现有运行配置重新运行它们,但使用特权标志设置回原件。扩展的文件在此处的要点中提供:https://gist.github.com/therealjessesanford/5a012218889831926169

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

我还将为谷歌用户内联它们:

. eb扩展/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/files/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)"

. eb扩展/文件/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)"

/dockrun.aws.json

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "happy_container_name",
      "image": "tutum.co/happy/happy_container",
      "memory": 128,
      "essential": false,
      "privileged": true
    }
  ]
}
 类似资料:
  • 问题内容: 我使用以下命令创建了容器: 以下是命令: 真的没有太多要说的,我希望容器能启动并保持正常运行。这是日志: 问题答案: 您正在尝试运行,它是需要tty 才能运行的交互式外壳。使用,在“分离”模式下运行此命令实际上没有任何意义,但是您可以通过添加到命令行来做到这一点,以确保容器具有与其关联的有效tty并保持连接状态: 在启动分离的容器时,您通常会运行某种长期存在的非交互式进程(例如,或We

  • 我正在尝试使用Docker Compose(在Windows上使用Docker Machine)来启动一组Docker容器。 成功运行。当我运行时,我会得到以下输出: 我确认了docker容器没有运行。如何启动集装箱?

  • 问题内容: 我想在Centos7的Docker容器中运行Jenkins。我看到了Jenkins的官方文档:首先,从Docker存储库中提取官方的jenkins映像。 接下来,使用该映像运行一个容器,并将数据目录从该容器映射到主机;例如,在下面的示例中,容器中的/ var / jenkins_home从主机上的当前路径映射到jenkins /目录。Jenkins 8080端口也以49001的身份向主

  • 问题内容: 如果我以特权模式运行容器,它是否具有所有内核功能,还是需要单独添加它们? 问题答案: 实际上,以特权模式运行确实为容器提供了所有功能。但是,最好始终给容器提供所需的最低要求。 如果您查看Docker文档,它们也会引用此标志: 完整的容器功能(特权) --privileged标志为容器提供了所有功能,并且还解除了设备cgroup控制器强制执行的所有限制。换句话说,容器可以完成主机可以做的

  • 问题内容: 要为Ubuntu映像启动交互式shell,我们可以运行: 但是,对于Alpine Docker映像运行此命令时,将得到以下结果: 在Alpine基本容器中启动交互式Shell的命令是什么? 问题答案: 上面使用的选项: 是BusyBox提供的Ash(Almquist Shell)。 退出时自动移除容器() 交互模式(即使未连接也保持STDIN打开) 分配伪TTY

  • 问题内容: 最近,我在Oracle Linux上安装了Docker CE。 不幸的是,当我想用​​以下方法启动第一个容器时: 我收到此错误消息: 泊坞窗:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:345:启动容器进程导致“ process_linux.go:430:容器初始化引起了\“ write / proc / self / attr / keycre