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

时间:2017-12-07 04:58:07

标签: docker docker-compose

我正在尝试向mattermost/mattermost-preview泊坞窗图片添加一个卷。此图像的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.

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

2 个答案:

答案 0 :(得分:1)

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

VOLUME ./mattermost-data

作为mentioned here,问题是相对于什么?它是否相对于容器的某个workdir?在构建图层时,它是否与本地文件系统相关?

通常的做法是使用绝对路径创建卷,例如/mattermost-data(因此此挂载点将位于容器的根级别)。

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

更多详情:

正如报道here一样,Dockerfile中VOLUME的相对路径不会导致Dockerfile必然中断,只是它们总是被相对于/和不要关心任何中间WORKDIR或创建图像所涉及的临时层等。

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

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

答案 1 :(得分:0)

我认为在您的图片中docker-remote.registry.kroger.com/mattermost/mattermost-preview不存在文件夹/mm/mock-mount

你可以分享你的图像Dockerfile吗?

然后,尝试将entrypoint更改为

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