[英]How can I run a Docker container in AWS Elastic Beanstalk with non-default run parameters?
我有一个Docker容器,可以在我的本地开发机器上运行。 我想将其移至AWS Elastic Beanstalk ,但我遇到了一些麻烦。
我正在尝试使用s3fs
将S3
存储桶安装到我的容器中。 我有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-files
中run_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.