连接卷时数据源的优先级
Priority of data source when connecting a volume
在将持久存储附加到 pod 时,我找不到有关数据源优先级的任何信息。
可能是我的图像已经在我即将安装持久存储的目录中包含一些数据。在这种情况下会发生什么?
在Docker中是这样的:
- with bind挂载host目录的内容优先
- 对于卷挂载,容器内容优先(尽管我不确定如果卷和容器都包含数据会发生什么)。
是否有关于 Kubernetes 的文档?理想情况下,我希望有一个 option/flag 来指定应优先使用哪个数据源。即,如果我希望图像数据优先,则将清除已安装的卷数据,并在安装过程中将图像数据放在那里。
安装的内容总是优先于图像中的内容。这与标准 Unix mount(8) 命令的工作方式相同:之前碰巧位于该挂载点的任何内容都被隐藏了。这在普通 Linux 中是正确的,在 Docker 中适用于所有类型的卷安装,在 Kubernetes 中适用于所有类型的卷安装。
Docker 命名的卷有一些看起来像异常的东西。如果您启动一个容器,并尝试在包含映像内容的目录上安装一个空的命名卷,Docker 会将映像的内容复制到该卷。 仅使用本机Docker(不是Kubernetes),它仅使用命名卷(不是绑定安装),它仅 发生在卷为空时。卷不是底层图像的一般传递!这会导致诸如“Docker 忽略我的节点 package.json
文件中的更改”或“我的 Nginx 代理服务于我的静态内容的旧版本”之类的问题,因为一旦命名卷中有内容,它将永远优先。
如果您需要将初始内容放入卷中,您的容器需要知道在启动时执行此操作。通常,您会使用入口点脚本执行此操作,该脚本执行所需的任何初始设置,然后执行 exec "$@"
到 运行 主容器命令。如果你可以 运行 像数据库这样的命令 initdb
来创建一个空的骨架文件结构,或者你可以 cp -a
来自未被卷安装隐藏的目录中的内容。如果目标卷目录中已经有内容,则由您的入口点脚本决定如何协调它。
#!/bin/sh
# entrypoint.sh
# Copy content into the `/data` directory if necessary
if [ ! -f /data/any-file.txt ]; then
cp -a /app/data /data
fi
# Launch the main container command
exec "$@"
# Dockerfile
ENTRYPOINT ["/app/entrypoint.sh"] # must be JSON-array form
CMD ["/app/my-app"] # as before
我建议使用 Docker 主机文件系统绑定挂载尝试此设置。它没有 Docker 首次使用时复制设置,因此如果它与 Docker 绑定挂载一起正常工作,它应该可以在所有环境中工作,包括 Kubernetes。这也有一个好处,就是可以很容易地仔细检查挂载目录中显示的正确内容。
在将持久存储附加到 pod 时,我找不到有关数据源优先级的任何信息。 可能是我的图像已经在我即将安装持久存储的目录中包含一些数据。在这种情况下会发生什么?
在Docker中是这样的:
- with bind挂载host目录的内容优先
- 对于卷挂载,容器内容优先(尽管我不确定如果卷和容器都包含数据会发生什么)。
是否有关于 Kubernetes 的文档?理想情况下,我希望有一个 option/flag 来指定应优先使用哪个数据源。即,如果我希望图像数据优先,则将清除已安装的卷数据,并在安装过程中将图像数据放在那里。
安装的内容总是优先于图像中的内容。这与标准 Unix mount(8) 命令的工作方式相同:之前碰巧位于该挂载点的任何内容都被隐藏了。这在普通 Linux 中是正确的,在 Docker 中适用于所有类型的卷安装,在 Kubernetes 中适用于所有类型的卷安装。
Docker 命名的卷有一些看起来像异常的东西。如果您启动一个容器,并尝试在包含映像内容的目录上安装一个空的命名卷,Docker 会将映像的内容复制到该卷。 仅使用本机Docker(不是Kubernetes),它仅使用命名卷(不是绑定安装),它仅 发生在卷为空时。卷不是底层图像的一般传递!这会导致诸如“Docker 忽略我的节点 package.json
文件中的更改”或“我的 Nginx 代理服务于我的静态内容的旧版本”之类的问题,因为一旦命名卷中有内容,它将永远优先。
如果您需要将初始内容放入卷中,您的容器需要知道在启动时执行此操作。通常,您会使用入口点脚本执行此操作,该脚本执行所需的任何初始设置,然后执行 exec "$@"
到 运行 主容器命令。如果你可以 运行 像数据库这样的命令 initdb
来创建一个空的骨架文件结构,或者你可以 cp -a
来自未被卷安装隐藏的目录中的内容。如果目标卷目录中已经有内容,则由您的入口点脚本决定如何协调它。
#!/bin/sh
# entrypoint.sh
# Copy content into the `/data` directory if necessary
if [ ! -f /data/any-file.txt ]; then
cp -a /app/data /data
fi
# Launch the main container command
exec "$@"
# Dockerfile
ENTRYPOINT ["/app/entrypoint.sh"] # must be JSON-array form
CMD ["/app/my-app"] # as before
我建议使用 Docker 主机文件系统绑定挂载尝试此设置。它没有 Docker 首次使用时复制设置,因此如果它与 Docker 绑定挂载一起正常工作,它应该可以在所有环境中工作,包括 Kubernetes。这也有一个好处,就是可以很容易地仔细检查挂载目录中显示的正确内容。