如何保留 Docker 个容器卷文件?
How to keep Docker container volume files?
我想与主机共享 ~/mydir
目录,但不想用主机文件替换 Docker 容器目录。
所以,我有 docker-compose.yml
version: '2'
services:
app:
container_name: mono
build: .
volumes:
# save .composer files on host to keep cache warmed up
- '/srv/mono/mydir:/root/mydir'
command: sleep infinity
和Dockerfile
#/bin/bash
FROM php:5.6
RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json
VOLUME /root/mydir
目录 /srv/mono/mydir
为空。它被替换为主机目录。清楚了。
但是如何保留原始文件呢?
例如,它适用于 MySQL Percona 容器:
version: '2'
services:
percona-56:
container_name: percona-56
image: percona/percona-server:5.6
volumes:
- /srv/mysql/percona-56:/var/lib/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
容器中有原始文件:
$ ll /srv/mysql/percona-56
total 176220
auto.cnf
error.log
ibdata1
ib_logfile0
ib_logfile1
init.ok
mysql
performance_schema
我试图检查 Percona Dockerfile 但没有找到与卷共享相关的内容。
$ docker --version
Docker version 1.12.3, build 6b644ec
当您在 docker 运行 添加 VOLUME 时,您的意思是使用主主机文件系统而不是 Docker 用于的写时复制文件系统图片。这里有两个主要选项:
- 您将实际的文件系统位置绑定挂载到映像中。这就是你在这里所做的。
- 你让 Docker 处理位置...在这种情况下,Docker 在主文件系统上创建位置,然后将图像的内容复制到该位置以开始工作.
您希望两者兼得 - 您希望在文件系统上有一个固定位置,但您希望图像中的文件位于该位置。现在,它不能以这种方式工作是有原因的!如果 'auto.conf' 已经存在于该文件夹中并且您启动了您的容器,会发生什么情况?如果 运行 两个具有不同版本文件的容器指向同一个位置,会发生什么情况?这就是为什么如果你选择一个真实的位置,它不会尝试猜测如何处理图像和文件系统之间的冲突,它只会随文件系统一起移动。
不过你可以实现你想要的。确实有两种选择。更好的方法是让您的应用程序从两个单独的文件夹中读取 - 一个在图像中填充,另一个在您的文件系统上。这完全避免了这个问题 ;) 第二个选项是进入并告诉 Docker 如何处理图像中的单个文件。
version: '2'
services:
app:
container_name: mono
build: .
volumes:
# save .composer files on host to keep cache warmed up
- '/srv/mono/mydir:/root/mydir'
# Marking a volume this way will tell Docker to use THIS file
# from the image, even though the parent directory is a regular
# volume. If you have an auto.cnf file in your directory, it
# will be ignored.
- /root/mydir/auto.cnf
command: sleep infinity
......
我想与主机共享 ~/mydir
目录,但不想用主机文件替换 Docker 容器目录。
所以,我有 docker-compose.yml
version: '2'
services:
app:
container_name: mono
build: .
volumes:
# save .composer files on host to keep cache warmed up
- '/srv/mono/mydir:/root/mydir'
command: sleep infinity
和Dockerfile
#/bin/bash
FROM php:5.6
RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json
VOLUME /root/mydir
目录 /srv/mono/mydir
为空。它被替换为主机目录。清楚了。
但是如何保留原始文件呢?
例如,它适用于 MySQL Percona 容器:
version: '2'
services:
percona-56:
container_name: percona-56
image: percona/percona-server:5.6
volumes:
- /srv/mysql/percona-56:/var/lib/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
容器中有原始文件:
$ ll /srv/mysql/percona-56
total 176220
auto.cnf
error.log
ibdata1
ib_logfile0
ib_logfile1
init.ok
mysql
performance_schema
我试图检查 Percona Dockerfile 但没有找到与卷共享相关的内容。
$ docker --version
Docker version 1.12.3, build 6b644ec
当您在 docker 运行 添加 VOLUME 时,您的意思是使用主主机文件系统而不是 Docker 用于的写时复制文件系统图片。这里有两个主要选项:
- 您将实际的文件系统位置绑定挂载到映像中。这就是你在这里所做的。
- 你让 Docker 处理位置...在这种情况下,Docker 在主文件系统上创建位置,然后将图像的内容复制到该位置以开始工作.
您希望两者兼得 - 您希望在文件系统上有一个固定位置,但您希望图像中的文件位于该位置。现在,它不能以这种方式工作是有原因的!如果 'auto.conf' 已经存在于该文件夹中并且您启动了您的容器,会发生什么情况?如果 运行 两个具有不同版本文件的容器指向同一个位置,会发生什么情况?这就是为什么如果你选择一个真实的位置,它不会尝试猜测如何处理图像和文件系统之间的冲突,它只会随文件系统一起移动。
不过你可以实现你想要的。确实有两种选择。更好的方法是让您的应用程序从两个单独的文件夹中读取 - 一个在图像中填充,另一个在您的文件系统上。这完全避免了这个问题 ;) 第二个选项是进入并告诉 Docker 如何处理图像中的单个文件。
version: '2'
services:
app:
container_name: mono
build: .
volumes:
# save .composer files on host to keep cache warmed up
- '/srv/mono/mydir:/root/mydir'
# Marking a volume this way will tell Docker to use THIS file
# from the image, even though the parent directory is a regular
# volume. If you have an auto.cnf file in your directory, it
# will be ignored.
- /root/mydir/auto.cnf
command: sleep infinity
......