如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器? [英] How can I run a Docker container in AWS Elastic Beanstalk with non-default run parameters?
问题描述
我有一个 Docker 容器,它在我的本地开发机器上运行良好.我想将其移至 AWS Elastic Beanstalk,但遇到了一些小问题.
I have a Docker container that runs great on my local development machine. I would like to move this to AWS Elastic Beanstalk, but I am running into a small bit of trouble.
我正在尝试使用 s3fs
将 S3
存储桶安装到我的容器.我有 Dockerfile:
I am trying to mount an S3
bucket to my container by using s3fs
. I have the 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"]
然后我安装 s3fs
,挂载一个 S3
存储桶,并在创建映像后运行 Tomcat 服务器,通过运行 run_docker.sh
:
And I install s3fs
, mount an S3
bucket, and run the Tomcat server after the image has been created, by running run_docker.sh
:
#!/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 容器时:
When I build and run this Docker container using the command:
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
存储桶.
it works well. Yet, when I remove the --cap-add mknod --cap-add sys_admin --device=/dev/fuse
, then s3fs
fails to mount my S3
bucket.
现在,我想在 AWS Elastic Beanstalk 上运行它,当我部署容器(并运行 run_docker.sh
),除run_docker.sh
中的s3fs my-bucket/opt/s3-files
步骤无法挂载bucket 外,所有步骤都执行正常.
Now, I would like to run this on AWS Elastic Beanstalk, and when I deploy the container (and run run_docker.sh
), all the steps execute fine, except the step s3fs my-bucket /opt/s3-files
in run_docker.sh
fails to mount the bucket.
据推测,这是因为无论 Elastic Beanstalk 为运行 Docker 容器做什么,它都没有添加任何其他标志,例如 --cap-add mknod --cap-add sys_admin --device=/dev/保险丝
.
Presumably, this is because whatever Elastic Beanstalk does to run a Docker container, it doesn't add any additional flags like, --cap-add mknod --cap-add sys_admin --device=/dev/fuse
.
我的 Dockerrun.aws.json
文件看起来像:
My Dockerrun.aws.json
file looks like:
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "tomcat:7.0"
},
"Ports": [
{
"ContainerPort": "8080"
}
]
}
是否可以向 AWS EB Docker 部署添加额外的 docker run
标志?另一种选择是找到另一种挂载 S3
存储桶的方法,但我怀疑无论如何我都会遇到类似的权限错误.有没有人看到任何方法来完成这个???
Is it possible to add additional docker run
flags to an AWS EB Docker deployment?
An alternative option is to find another way to mount an S3
bucket, but I suspect I'd run into similar permission errors regardless. Has anyone seen any way to accomplish this???
更新:
对于尝试使用下面@Egor 的回答的人来说,当 EB 配置设置为使用 v1.4.0 运行 Docker 1.6.0
时,它会起作用.任何超过 v1.4.0 版本的东西都会失败.因此,要使其正常工作,请正常构建您的环境(这应该会导致构建失败),然后使用运行 Docker 1.6.0 的 v1.4.0 配置重新构建它.应该这样做!
For people trying to use @Egor's answer below, it works when the EB configuration is set to use v1.4.0 running Docker 1.6.0
. Anything past the v1.4.0 version fails. So to make it work, build your environment as normal (which should give you a failed build), then rebuild it with a v1.4.0 running Docker 1.6.0
configuration. That should do it!
推荐答案
如果您使用的是最新版本的 aws docker stack(例如 docker 1.7.1),则需要稍微修改上面的答案.试试这个:
If you are using the latest version of aws docker stack (docker 1.7.1 for example), you'll need to slightly modify the above answer. Try this:
commands:
00001_add_privileged:
cwd: /tmp
command: 'sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'
注意位置的变化&&运行脚本名称
Notice the change of location && name of the run script
这篇关于如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!