我实际上试图用Docker实现一些东西,但是我被卡住了,这是我的问题。
我的容器托管在EC2上,里面有我的网络应用程序。我的webapp用作数据库JCR存储库,它基本上是一个存储在你想要的文件。所以每次我的网络应用程序启动时,如果存储库不存在,它会创建它,否则它会使用现有的。
我当前的docker文件看起来像这样https://gist.github.com/agonist/7cab7358379e9dd6e812 ./chameleon.sh start刚启动我的webapp。在这个应用程序中,我配置了存储库文件所在的位置。
现在我创建了一个连接并安装在我的EC2实例中的EBS卷。该卷将专用于存储存储库。基本上在我的应用程序中,我将我的存储库路径配置为/mnt/repository/
,其中存储库是包含由我的Web应用程序创建的存储库文件的目录。
但是我不知道如何在Dockefile中的./chameleon.sh start
之前将这个卷安装到我的容器中。正如我在研究期间所看到的那样
docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app
不能从Dockefile执行。
我还发现了一些关于数据的容器,它与另一个容器共享一个卷,但如果我必须运行
仍然是同样的问题sudo docker run -d --volumes-from dbdata
我的容器启动后
答案 0 :(得分:4)
简短版本:这不是一个答案,只是对它的一点帮助,澄清了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
使用--volumes-from
时,它是一回事。卷在>>执行命令之前安装。
为什么会失败?我不确定,检查mount
结果并使用您的EBS进行一些手动测试会很有趣。我有一些容器安装EBS卷,它工作正常。
答案 1 :(得分:1)