【问题标题】:Docker build failure due to “mount volume over existing file”由于“在现有文件上安装卷”导致 Docker 构建失败
【发布时间】:2018-01-05 06:47:31
【问题描述】:

由于以下错误,我遇到了构建失败的问题:

Step 12/13 : VOLUME /var/lib/postgresql/data cannot mount volume over existing file, file exists /var/lib/docker/aufs/mnt/a3d9ab74930d907691fb8870a29ea08b8fab0bd0fd7ecb1064982be512d904fa/var/lib/postgresql/data

我之前构建了映像,在本地运行它(没有安装卷),然后编辑 Dockerfile,并尝试再次构建它。我已经删除了所有停止的容器,并删除了我所有的悬空卷。 docker volume ls 没有显示任何卷,但我仍然收到此错误。此外,每次我运行它时,我都会在错误消息中更改 mnt 后的目录名称。

Dockerfile:

FROM multiarch/alpine:armhf-v3.7
ENV GOSU_DOWNLOAD_KEY="0x036A9C25BF357DD4"

ENV PGDATA /var/lib/postgresql/data

ADD pg_hba.conf /var/lib/postgresql/data
ADD postgresql.conf /var/lib/postgresql/data
ADD docker-entrypoint.sh /

RUN apk add --update --no-cache postgresql tzdata curl gnupg && \
    gpg-agent --daemon && \
    gpg --keyserver pgp.mit.edu --recv-keys $GOSU_DOWNLOAD_KEY && \
    echo "trusted-key $GOSU_DOWNLOAD_KEY" >> /root/.gnupg/gpg.conf && \
    curl -sSL https://github.com/tianon/gosu/releases/download/1.10/gosu-armhf > gosu && \
    curl -sSL https://github.com/tianon/gosu/releases/download/1.10/gosu-armhf.asc > gosu.asc && \
    gpg --verify gosu.asc && \
    rm gosu.asc && \
    mv gosu /usr/bin/gosu && \
    chmod +x /usr/bin/gosu && \
    apk del --purge curl gnupg && \
    rm -rf /root.gnupg

ENTRYPOINT /docker-entrypoint.sh
EXPOSE 5432

VOLUME /var/lib/postgresql/data

CMD "postgres"

为什么这些构建失败了?我正在使用 docker for mac。

【问题讨论】:

  • 您能否展示如何传递-v env 变量。 .in docker-compose 文件,如果您使用 docker-compose 或您发出 docker run 的方式,如果您手动运行构建。 .
  • 我没有为此使用 docker-compose。以下是我运行 docker run 的方式:docker run --rm -it postgres /bin/sh,运行了一些 postgres 操作来测试镜像,然后退出镜像。
  • 此外,我运行了docker system prune -a 并尝试再次构建它。我收到了同样的错误。
  • 你能发布 Dockerfile 吗?
  • @TillHoffmann 使用 Dockerfile 编辑了这篇文章

标签: docker docker-for-mac


【解决方案1】:

您使用ADD postgresql.conf /var/lib/postgresql/data 复制postgres 配置,它与您尝试使用VOLUME /var/lib/postgresql/data 挂载的卷具有相同的路径,不允许这样做以防止意外行为。

【讨论】:

    【解决方案2】:

    这不准确。

    当涉及到 Dockerfile 和 ADD/COPY 命令以及 VOLUME 时,它们的顺序无关紧要。

    在 dockerfile 中,VOLUME 命令可确保生成的映像在构建期间或稍后运行容器的 docker commit 命令期间没有指定路径中的数据。事实上,每个正在运行的容器都为该路径创建了一个单独的卷。除了 ADD 和 COPY 命令。这些命令将始终在生成的 docker 映像中的指定路径中生成数据。

    此错误可能是因为 FROM docker 映像已在同一路径中包含 VOLUME 声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2011-09-17
      • 2018-04-22
      • 2023-01-02
      • 1970-01-01
      相关资源
      最近更新 更多