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

标签 docker docker-compose

我正在尝试将卷添加到 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 文件中取出 volumesentrypoint 部分,那么容器启动没有问题,尽管在我看来错误出在原始图像上。有办法在这里做我想做的事吗?

最佳答案

在 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/

相关文章:

php - 如何增加 docker 中的超时时间?

logging - 如何在单个主机中分离多个容器的日志?

docker - 打开第二个 vscode devcontainer 会关闭第一个

django - Docker、Django 和 Selenium - Selenium 无法连接

string - docker-compose.yml invalid : app. build contains an invalid type, 它应该是一个字符串

docker - 如何在 CLI 中使用 ctr 在 containerd 中运行 docker 图像?

mysql - 无法从 Node 但从终端访问mysql容器

windows - Windows 2016 上的 Docker 错误 "Client.Timeout exceeded while awaiting headers"

docker - `docker-compose logs` 从哪里拉?

apache - 从数据容器更新共享卷