Docker 装载到覆盖内容的文件夹
Docker mount to folder overriding content
我有一个 .net Core web Api 在名为 Config 的文件夹下有配置文件。
我从中创建了图像和一个容器,我正确地看到使用终端,容器中包含文件夹和配置文件。
我的问题是,到目前为止我找不到创建相同容器的方法 mounting/binding Config 文件夹到物理路径,遵循要求:
1) 将 Config 文件夹挂载到特定主机位置
2) 创建容器时,Config 文件夹中应包含镜像中的文件
3) 在创建容器时,用图像中的文件覆盖文件夹中已存在的任何现有文件
4) 能够从主机自定义文件夹中的配置文件
我的创建命令:
docker --tls -H="$containerUrl" `
create `
--hostname $hostname `
--name $containerName `
--mac-address=$containerMacAddress `
--ip $containerIpAddress `
--net "bridged-network" `
--workdir '/app' `
--mount type=bind,src=$configVolumePath,target=/app/Config `
--publish "0.0.0.0::80" `
-t `
-i $imageName":"$script:buildversion
Using --mount with type bind, 按照文档中的说明,如果文件夹中有任何文件,那些hare隐藏在容器中,应用程序将看到已部署的文件。
这个解决方案的问题是我无法从主机更新配置文件夹中的文件。
现在,删除 type=bind 我得到了相同的结果,但令人困惑。
我尝试使用 volume --volume $configVolumePath":/app/Config:rw",但这样做不会覆盖主机目录中预先存在的文件这些是将在容器中使用的。
补充说明,我没有在 Dockerfile 或 compose 中指定任何与卷安装相关的内容,我也没有尝试创建一个卷然后将其用作源,但我认为这不会有所作为。
容器服务器在 NAS 上 运行,这是版本:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: 781516c
Built: Thu Aug 3 16:04:05 2017
OS/Arch: linux/amd64
显然我遗漏了一些东西,我必须了解更多有关 docker 的信息,有人可以帮忙吗?
我的参考资料:
1) https://docs.docker.com/engine/admin/volumes/bind-mounts/
首先,docker 卷或绑定装载的行为类似于 linux 装载。
如果主机 volume/mount 存在并包含文件,它将“覆盖”容器中的任何内容。如果不是,容器文件将镜像到主机 volume/mount 并且容器文件夹和主机将同步。
在这两种情况下,在主机上编辑文件将始终反映在容器内。
对于您的情况,您可以执行以下操作:
docker volume create --driver local \
--opt type=none \
--opt device=$configVolumePath \
--opt o=bind \
config_vol
这将创建一个卷,该卷将保留在主机上的 $configVolumePath 中。
创建容器时使用该卷:
docker create --volume config_vol:/app/Config
启动时,主机文件夹将为空,图像中的文件将“复制”到主机文件夹中。 $configVolumePath
中的编辑文件将反映在容器内,类似地
在容器 /app/Config
中编辑的文件将反映在主机上的 $configVolumePath
中。
我有一个 .net Core web Api 在名为 Config 的文件夹下有配置文件。 我从中创建了图像和一个容器,我正确地看到使用终端,容器中包含文件夹和配置文件。
我的问题是,到目前为止我找不到创建相同容器的方法 mounting/binding Config 文件夹到物理路径,遵循要求:
1) 将 Config 文件夹挂载到特定主机位置
2) 创建容器时,Config 文件夹中应包含镜像中的文件
3) 在创建容器时,用图像中的文件覆盖文件夹中已存在的任何现有文件
4) 能够从主机自定义文件夹中的配置文件
我的创建命令:
docker --tls -H="$containerUrl" `
create `
--hostname $hostname `
--name $containerName `
--mac-address=$containerMacAddress `
--ip $containerIpAddress `
--net "bridged-network" `
--workdir '/app' `
--mount type=bind,src=$configVolumePath,target=/app/Config `
--publish "0.0.0.0::80" `
-t `
-i $imageName":"$script:buildversion
Using --mount with type bind, 按照文档中的说明,如果文件夹中有任何文件,那些hare隐藏在容器中,应用程序将看到已部署的文件。 这个解决方案的问题是我无法从主机更新配置文件夹中的文件。
现在,删除 type=bind 我得到了相同的结果,但令人困惑。
我尝试使用 volume --volume $configVolumePath":/app/Config:rw",但这样做不会覆盖主机目录中预先存在的文件这些是将在容器中使用的。
补充说明,我没有在 Dockerfile 或 compose 中指定任何与卷安装相关的内容,我也没有尝试创建一个卷然后将其用作源,但我认为这不会有所作为。
容器服务器在 NAS 上 运行,这是版本:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: 781516c
Built: Thu Aug 3 16:04:05 2017
OS/Arch: linux/amd64
显然我遗漏了一些东西,我必须了解更多有关 docker 的信息,有人可以帮忙吗?
我的参考资料:
1) https://docs.docker.com/engine/admin/volumes/bind-mounts/
首先,docker 卷或绑定装载的行为类似于 linux 装载。
如果主机 volume/mount 存在并包含文件,它将“覆盖”容器中的任何内容。如果不是,容器文件将镜像到主机 volume/mount 并且容器文件夹和主机将同步。 在这两种情况下,在主机上编辑文件将始终反映在容器内。
对于您的情况,您可以执行以下操作:
docker volume create --driver local \
--opt type=none \
--opt device=$configVolumePath \
--opt o=bind \
config_vol
这将创建一个卷,该卷将保留在主机上的 $configVolumePath 中。
创建容器时使用该卷:
docker create --volume config_vol:/app/Config
启动时,主机文件夹将为空,图像中的文件将“复制”到主机文件夹中。 $configVolumePath
中的编辑文件将反映在容器内,类似地
在容器 /app/Config
中编辑的文件将反映在主机上的 $configVolumePath
中。