无法通过docker-compose将音量添加到图像

我正在尝试将卷添加到mattermost / mattermost预览泊坞窗图像。 这个图片的Dockerfile(不受我控制)是:

# Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. # See License.txt for license information. FROM mysql:5.7 # Install ca-certificates to support TLS of Mattermost v3.5 RUN apt-get update && apt-get install -y ca-certificates # # Configure SQL # ENV MYSQL_ROOT_PASSWORD=mostest ENV MYSQL_USER=mmuser ENV MYSQL_PASSWORD=mostest ENV MYSQL_DATABASE=mattermost_test # # Configure Mattermost # WORKDIR /mm # Copy over files ADD https://releases.mattermost.com/4.4.4/mattermost-team-4.4.4-linux-amd64.tar.gz . RUN tar -zxvf ./mattermost-team-4.4.4-linux-amd64.tar.gz ADD config_docker.json ./mattermost/config/config_docker.json ADD docker-entry.sh . RUN chmod +x ./docker-entry.sh ENTRYPOINT ./docker-entry.sh # Create default storage directory RUN mkdir ./mattermost-data VOLUME ./mattermost-data # Ports EXPOSE 8065 

我想添加一个卷到这个图像和一个自定义的入口点,这样我可以添加一些testing数据到我的容器启动之前的mysql数据库。 我正在尝试使用docker-compose来执行此操作:

 version: '3' services: mattermost: ports: - "8065:8065" image: mattermost/mattermost-preview volumes: - ./end_to_end/mattermost/mock-mount:/mm/mock-mount entrypoint: /mm/mock-mount/docker-entry.sh 

但是我很遗憾不能启动,当我尝试运行docker-compose up ,出现错误

 ERROR: for mattermost Cannot create container for service mattermost: invalid bind mount spec "39742853c03b3b2747f11c942a4a76e4cd138ad41d54f70f71d7aa9ccc36dcca:mattermost-data:rw": invalid volume specification: '39742853c03b3b2747f11c942a4a76e4cd138ad41d54f70f71d7aa9ccc36dcca:mattermost-data:rw': invalid mount config for type "volume": invalid mount path: 'mattermost-data' mount path must be absolute ERROR: Encountered errors while bringing up the project. 

奇怪的是 – 如果我从我docker-compose.yml文件中取出volumesentrypoint部分,那么容器启动没有问题,即使在我看来,错误是与原始图像。 有没有办法做到我想在这里?

在Dockerfile中声明与docker-compose一起使用的卷时,不能使用相对path:

 VOLUME ./mattermost-data 

正如这里提到的 ,这个问题是相对于什么的? 这是相对于容器的一些workdir? 在构build图层时,是否与本地文件系统相关?

通常的做法是创build具有绝对path的卷,例如just /mattermost-data (因此此挂载点将位于容器的根级别)。

在撰写文件中,源path的相对path是可以的,但是它是相对于撰写文件本身来解释的…所以你必须小心,不要认为它是相对于某个容器path的。 目标path仍然不允许相对path。

更多细节:

正如这里所报道的,Dockerfile中VOLUME的相对path不会导致Dockerfile中断,只是它们总是相对于/而不关心任何中间WORKDIR或创build映像所涉及的临时层等等

基本上,如果你手动执行docker build ,创build一个相对的VOLUME将在顶层创build它。 对于docker-compose ,它根本不起作用,并抛出你所看到的错误。

您可能希望向该Dockerfile的作者提交错误报告,因为VOLUME ./mattermost-data使用VOLUME ./mattermost-data任何下游用户想要直接与docker-compose一起使用该映像。

我想在你的图片docker-remote.registry.kroger.com/mattermost/mattermost-preview不存在的文件夹/mm/mock-mount

你能分享你的图片Dockerfile吗?

然后,尝试更改entrypoint

entrypoint: /bin/bash -c "/mm/mock-mount/docker-entry.sh"