我想与主机共享~/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
答案 0 :(得分:9)
当你在docker run上添加VOLUME时,你所说的是使用主要主机文件系统而不是Docker用于图像的copy-on-write文件系统。这里有两个主要选项:
您希望同时获得两者 - 您希望文件系统上有固定位置,但您希望图像中的文件存在。现在,它有一个原因,它不会这样工作!如果' 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
...