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
这里使用卷的目的是什么,这是我的理解-请确认
- 在图像文件系统中创建 $PGDATA 指向的目录。
- 将它与 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 也会被持久化
我正在查看示例 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
这里使用卷的目的是什么,这是我的理解-请确认
- 在图像文件系统中创建 $PGDATA 指向的目录。
- 将它与 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