繁体   English   中英

如何使用非默认运行参数在AWS Elastic Beanstalk中运行Docker容器?

[英]How can I run a Docker container in AWS Elastic Beanstalk with non-default run parameters?

我有一个Docker容器,可以在我的本地开发机器上运行。 我想将其移至AWS Elastic Beanstalk ,但我遇到了一些麻烦。

我正在尝试使用s3fsS3存储桶安装到我的容器中。 我有Dockerfile:

FROM tomcat:7.0
MAINTAINER me@example.com

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"]

我通过运行run_docker.sh安装s3fs ,安装S3存储桶,并在创建映像后运行Tomcat服务器:

#!/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

当我使用以下命令构建并运行此Docker容器时:

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

它运作良好。 然而,当我删除--cap-add mknod --cap-add sys_admin --device=/dev/fuse ,然后s3fs无法装入我的S3桶。

现在 ,我想在AWS弹性魔豆运行它,当我部署容器(和运行run_docker.sh ),所有的步骤执行很好,除了步骤s3fs my-bucket /opt/s3-filesrun_docker.sh无法安装存储桶。

据推测,这是因为无论Elastic Beanstalk运行Docker容器,它都不会添加任何额外的标志,例如--cap-add mknod --cap-add sys_admin --device=/dev/fuse

我的Dockerrun.aws.json文件如下所示:

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

是否可以向AWS EB Docker部署添加额外的docker run标志? 另一种选择是找到另一种方法来安装S3存储桶,但我怀疑我会遇到类似的权限错误。 有谁见过任何方法来完成这个???

更新:

对于尝试使用@ Egor的答案的人来说,当EB配置设置为使用v1.4.0 running Docker 1.6.0时,它会起作用。 任何超过v1.4.0版本的内容都会失败。 因此,为了使其工作,正常构建您的环境(这应该会给您一个失败的构建),然后使用v1.4.0 running Docker 1.6.0配置的v1.4.0 running Docker 1.6.0重建它。 应该这样做!

如果您使用的是最新版本的aws docker stack(例如docker 1.7.1),则需要稍微修改上述答案。 尝试这个:

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

注意运行脚本的位置和&名称的更改

添加文件.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'

我也在使用s3fs

您现在可以使用任务定义添加功能。 以下是文档: https//docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

这是您要添加到任务定义中的具体内容:

"linuxParameters": {
    "capabilities": {
      "add": [
        "SYS_PTRACE"
      ]
    }
  },

感谢elijahchancey的回答,这是非常有帮助的。 我想补充一点评论:

Elasticbeanstalk现在使用ECS任务来部署和管理应用程序集群。 Multicontainer Docker配置文档中有一个非常重要的段落(我最初错过了)。

以下示例显示了常用的参数子集。 有更多可选参数。 有关任务定义格式和任务定义参数的完整列表的更多信息,请参阅Amazon ECS开发人员指南中的Amazon ECS 任务定义

因此,该文档不是完整的参考,但它只是显示典型的条目 ,你应该在其他地方找到更多。 这具有相当大的影响,因为现在(2018)您可以指定更多选项,而您不再需要破解ebextensions。 您需要做的只是在多Dockerrun.aws.json containerDefinitions中使用task参数。

在单个docker容器中没有提到这个,但是可以尝试验证...

带有额外上限的多码头Dockerrun.aws.json示例:

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "service1",
      "image": "myapp/service1:latest",
      "essential": true,
      "memoryReservation": 128,
      "portMappings": [
        {
          "hostPort": 8080,
          "containerPort": 8080
        }
      ],
      "linuxParameters": {
        "capabilities": {
          "add": [
            "SYS_PTRACE"
          ]
        }
      }
    }
  ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM