如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器? [英] How can I run a Docker container in AWS Elastic Beanstalk with non-default run parameters?

查看:35
本文介绍了如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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.

我正在尝试使用 s3fsS3 存储桶安装到我的容器.我有 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆