繁体   English   中英

带有Docker和EBS卷的EC2,在init期间在容器内安装EBS卷

[英]EC2 with Docker and EBS volume, mount EBS volume inside container during init

我实际上试图用Docker实现一些东西但是我被卡住了,这是我的问题。

我的容器托管在EC2上,里面有我的网络应用程序。 我的webapp用作数据库JCR存储库,它基本上是一个存储在你想要的文件。 因此,每次我的Web应用程序启动时,如果存储库不存在,它会创建它,否则它将使用现有的存储库。

我当前的docker文件看起来像这样https://gist.github.com/agonist/7cab7358379e9dd6e812 ./chameleon.sh start刚启动我的webapp。 在这个应用程序中,我配置了存储库文件所在的位置。

现在我创建了一个附加并安装在我的EC2实例中的EBS卷。 该卷将专用于存储存储库。 基本上,在我的应用程序中,我将存储库路径配置为/mnt/repository/ ,其中repository是包含由我的Web应用程序创建的存储库文件的目录。 但我不知道如何在./chameleon.sh start中的./chameleon.sh ./chameleon.sh start之前将这个卷安装到我的容器中。 正如我在研究中看到的那样

docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app

不能从Dockefile执行。

我还发现了与数据相关的容器,它与另一个容器共享一个卷,但如果我必须运行,仍然会出现同样的问题

sudo docker run -d --volumes-from dbdata

我的容器开始后

简短版本:这不是一个答案,只是对它有一点帮助,澄清了Docker的工作原理。

没有直接相关,但你的Dockerfile应该看起来像这样:

FROM dockerfile/java:oracle-java8

# Expose the port 9000
EXPOSE 9000

# Volumes
VOLUME /root/wisdom/logs
VOLUME /root/wisdom/application

# Change workdir.
WORKDIR /root/wisdom

RUN touch /root/wisdom.log

# Add the wisdom distribution
ADD . /root/wisdom

# For easier handling, we dump the log, so `docker logs containerId` displays
# the log.
CMD ./chameleon.sh start && tail -F logs/wisdom.log

这样,ADD之前的所有图层都会被缓存。 而在此之前,如果您更改目录中的任何内容,则会重新创建所有图层。 chameleon.sh应该是本地目录上的chmod,而不是运行时。 ADD保留权限。 当您启动容器时,没有必要stop ,您没有进程正在运行。

-v确实不能从Dockerfile执行。 这是预期的,因为Dockerfile是可移植的。 如果将其绑定到本地计算机,则会丢失此功能。

当您执行docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app ,将执行命令之前完成安装。 您可以通过运行docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app mount来仔细检查docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app mount

使用--volumes-from ,它是一回事。 执行命令之前安装卷。

为什么会失败? 我不确定,检查mount结果并使用您的EBS进行一些手动测试会很有趣。 我有一些容器安装EBS卷,它工作正常。

暂无
暂无

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

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