7

我实际上试图用 Docker 实现一些目标,但我被困住了,这是我的问题。

我将容器托管在 EC2 上,其中包含我的 Web 应用程序。我的 webapp 使用 JCR 存储库作为数据库,该存储库基本上是存储在您想要的位置的文件。所以每次我的网络应用程序启动时,如果存储库不存在,它就会创建它,否则它使用现有的。

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

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

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

不能从 Dockefile 执行。

我还发现了有关与另一个容器共享一个卷的仅数据容器的内容,但如果我必须运行,仍然存在同样的问题

sudo docker run -d --volumes-from dbdata

在我的容器启动后

4

2 回答 2

5

简短版本:这不是一个答案,只是对它的一点帮助,澄清了 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 卷,它工作正常。

于 2014-11-20T16:50:11.833 回答
1

查看这个相关问题:Mount specific EBS volume to Docker under AWS beanstalk和 AWS 论坛问题Docker does not see the mount until the docker daemon is restarted

于 2015-05-29T13:11:34.587 回答