Docker 由于“在现有文件上装载卷”导致构建失败
Docker build failure due to “mount volume over existing file”
我 运行 遇到一个问题,我的构建由于以下错误而失败:
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 后的目录名称。
Docker 文件:
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 用于 mac。
您使用 ADD postgresql.conf /var/lib/postgresql/data
复制了 postgres 配置,它与您尝试使用 VOLUME /var/lib/postgresql/data
装载的卷具有相同的路径,这是不允许的,以防止意外行为。
这不准确。
当谈到 Dockerfile 和 ADD/COPY 命令和 VOLUME 时,它们的顺序并不重要。
在 docker 文件中,VOLUME 命令确保生成的图像在构建期间指定路径中没有数据或稍后 docker 在 运行 容器上提交命令。事实上,每个 运行 容器都有一个为该路径创建的单独卷。 ADD 和 COPY 命令除外。这些命令将始终在生成的 docker 图像中的指定路径中生成数据。
此错误可能是因为 FROM docker 图像已在同一路径中包含 VOLUME 声明。
我 运行 遇到一个问题,我的构建由于以下错误而失败:
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 后的目录名称。
Docker 文件:
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 用于 mac。
您使用 ADD postgresql.conf /var/lib/postgresql/data
复制了 postgres 配置,它与您尝试使用 VOLUME /var/lib/postgresql/data
装载的卷具有相同的路径,这是不允许的,以防止意外行为。
这不准确。
当谈到 Dockerfile 和 ADD/COPY 命令和 VOLUME 时,它们的顺序并不重要。
在 docker 文件中,VOLUME 命令确保生成的图像在构建期间指定路径中没有数据或稍后 docker 在 运行 容器上提交命令。事实上,每个 运行 容器都有一个为该路径创建的单独卷。 ADD 和 COPY 命令除外。这些命令将始终在生成的 docker 图像中的指定路径中生成数据。
此错误可能是因为 FROM docker 图像已在同一路径中包含 VOLUME 声明。