具有Docker和EBS卷的EC2,在初始化期间在容器内安装EBS卷

我实际上试图用Docker实现某些function,但是卡住了,这是我的问题。

我有我的容器托pipe在EC2与我的networking应用程序里面。 我的Web应用程序使用数据库JCR存储库,这基本上是一个文件存储在你想要的。 所以每次我的web应用程序启动,如果存储库不存在,它会创build它,否则它使用现有的。

我目前的docker文件看起来像这个https://gist.github.com/agonist/7cab7358379e9dd6e812 ./chameleon.sh开始只是开始我的web应用程序。 在这个应用程序中,我configuration了存储库文件的位置。

现在我创build了一个EBS卷,并将其挂载到我的EC2实例中。 本卷将专门用于存储存储库。 所以基本上在我的应用程序我configuration我的存储库path/mnt/repository/其中存储库是将包含我的web应用程序创build我的存储库文件的目录。 但是我不知道如何在./chameleon.sh start之前将这个卷装载到我的容器中。 正如我在研究中看到的那样

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

不能从Dockefile执行。

我还发现了一些关于数据的容器,它与另一个容器共享一个容器,但是如果我必须运行的话,还是一样的问题

 sudo docker run -d --volumes-from dbdata 

我的容器启动后

简短的版本:这不是一个答案,只是一点点的帮助,澄清了如何工作。

不直接相关,但你的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之前的所有图层都被caching。 而之前,如果您更改目录中的任何内容,则会重新创build所有图层。 你chameleon.sh应该是你的本地目录chmod,而不是在运行时。 ADD保留权限。 当你启动你的容器时, stop是不必要的,你没有进程运行。

-v确实不能从Dockerfile执行。 这是Dockerfile的意图是可移植的。 如果你把它绑定到你的本地机器上,那么你就失去了这个function。

当你做你的docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app ,挂载执行命令之前完成。 你可以通过运行docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app mount

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

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

查看这个相关的问题: 在AWS beanstalk下将特定的EBS卷挂载到Docker,并且AWS Forum问题Docker 在docker 守护进程重新启动之前不会看到挂载 。