Postgres Dockerfile探索——VOLUME语句用法

Postgres Dockerfile exploration - VOLUME statement usage

我正在查看示例 docker 文件以了解如何使用 VOLUME,我从 - https://github.com/docker-library/postgres/blob/master/Dockerfile-alpine.template

中看到以下几行
ENV PGDATA /var/lib/postgresql/data
# this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA"
VOLUME /var/lib/postgresql/data

这里使用卷的目的是什么,这是我的理解-请确认

  1. 在图像文件系统中创建 $PGDATA 指向的目录。
  2. 将它与 VOLUME 映射,以便稍后创建的任何内容作为填充内容的一部分通过公开容器可以使用的预定义目录彻底 docker-entrypont.sh。

如果没有定义 VOLUME instr 怎么办?除非未定义 VOLUME,否则某人可能更费力地弄清楚在哪里保存自定义更改

这里定义了卷,所以当你启动一个容器(从这个图像中)时,一个新的匿名卷被创建。

该卷将保存您在这方面的敏感数据,因此这就是您在 normal/soft docker 图像生命周期期间 "persist" 所需的全部内容。

通常当 docker 图像的维护者已经知道数据的位置时,这些数据将是明智的保存位置(如此处),将使用 Dockerfile 中的 VOLUME 装饰文件夹.如前所述,这将在运行时创建一个匿名卷,但也会让您知道(使用 docker inspect 或阅读 Dockerfile )持久性卷所在的位置。

在生产中,您通常会在 docker-compose 文件中使用命名卷/路径装载到这个文件夹

docker-compose.yml 作为命名卷

volumes:
  mydbdata:/var/lib/postgresql/data

docker-compose.yml 作为路径

volumes:
  ./local/path/data:/var/lib/postgresql/data

在Dockerfile中定义这样的VOLUME定义其实是有弊端的,这里就不细说了,主要是"lifetime".

Dockerfile和运行

中没有VOLUME
docker-compose up -d
# do something, manipulate the data
docker-compose down

# all your data would be lost when starting again
docker-compose up -d

不仅会删除 运行 容器,还会删除所有数据库数据,这可能不是您想要的(您只是想重新创建容器)。

在 Dockerfile 中使用 VOLUME,即使超过 docker-compose down

,anon-volume 也会被持久化