我正在尝试将卷添加到 mattermost/mattermost-preview docker 图像。该镜像的 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
我想向该镜像添加一个卷和一个自定义入口点,以便我可以在容器启动之前向 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
文件中取出 volumes
和 entrypoint
部分,那么容器启动没有问题,尽管在我看来错误出在原始图像上。有办法在这里做我想做的事吗?
最佳答案
在 Dockerfile 中声明要与 docker-compose 一起使用的卷时,不能使用相对路径:
VOLUME ./mattermost-data
如mentioned here ,问题是相对于什么?它是相对于容器的某些工作目录吗?在构建层时它与本地文件系统相关吗?
通常的做法是使用绝对路径创建卷,例如 /mattermost-data
(因此该挂载点将位于容器的根级别)。
在撰写文件中,相对路径对于源路径来说是可以的,但它是相对于撰写文件本身来解释的......所以你必须小心,不要认为它是相对于某些容器路径。目标路径仍然不允许使用相对路径。
更多详细信息:
据报道here ,Dockerfile 中 VOLUME 的相对路径不一定会导致 Dockerfile 损坏,只是它们始终相对于 /
进行处理,并且不关心任何中间 WORKDIR 或涉及的临时层创建图像等。
基本上,如果您手动执行docker build
,创建相对卷将在顶层创建它。但对于 docker-compose 来说,它根本不起作用,并且会抛出您所看到的错误。
您可能想向该 Dockerfile 的作者提交错误报告,因为使用 VOLUME ./mattermost-data
会限制任何想要通过 docker-compose 直接使用该镜像的下游人员。
关于docker - 无法通过 docker-compose 将音量添加到图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47687893/