EC2与Docker和EBS卷,初始化期间在容器内挂载EBS卷

7
我正在尝试使用Docker实现某些功能,但遇到了困难,以下是我的问题:
我的容器托管在EC2上,并包含我的Web应用程序。我的Web应用程序使用JCR存储库作为数据库,它基本上是一个文件存储在您想要的位置。因此,每次启动我的Web应用程序时,如果存储库不存在,则会创建它,否则会使用现有的存储库。
我的当前Docker文件看起来像这样https://gist.github.com/agonist/7cab7358379e9dd6e812 ./chameleon.sh start只启动我的Web应用程序。在此应用程序中,我配置了存储库文件的位置。
现在,我创建了一个EBS卷并将其挂载到我的EC2实例中。该卷将专门用于存储存储库。因此,基本上,在我的应用程序中,我将我的存储库路径配置为/mnt/repository/,其中存储库是包含由我的Web应用程序创建的存储库文件的目录。 但我不知道如何在Dockefile中的./chameleon.sh start之前将此卷挂载到我的容器中。根据我的研究,我看到
docker run -v /mnt/repository:/mnt/repository aws_beanstalk/current-app

在Dockerfile中无法执行。

我还发现了关于数据容器的内容,它们与另一个容器共享卷,但如果我必须运行,则仍然存在相同的问题。

sudo docker run -d --volumes-from dbdata

容器启动后


所以 /mnt/repository 是一个 文件 挂载点吗?还是挂载点是 /mnt?为了确保:您在同一实例上运行 docker 客户端,而不是在具有远程 DOCKER_HOST 的本地计算机上运行。 - creack
我更新了主题以使其更清晰。/mnt/repository/是应用程序将保存存储库文件的目录。是的,我只在我的EC2实例上工作,本地机器上没有任何操作。 - agonist_
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 时,情况也是一样的。卷在执行命令之前被挂载。 那么为什么会失败呢?我不确定,检查挂载结果并对您的 EBS 进行一些手动测试将很有趣。我有一些容器挂载 EBS 卷,它们可以正常工作。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接