我尝试为不同的网站创建一个 docker-compose 图像。
一切正常,除了我的卷。
这里是一个docker-compose.yml
的例子:
version: '2'
services:
website:
build:
context: ./dockerfiles/
args:
MYSQL_ROOT_PASSWORD: mysqlp@ssword
volumes:
- ./logs:/var/log
- ./html:/var/www
- ./nginx:/etc/nginx
- ./mysql-data:/var/lib/mysql
ports:
- "8082:80"
- "3307:3306"
这里是我的 Dockerfile
:
FROM php:5.6-fpm
ARG MYSQL_ROOT_PASSWORD
RUN export DEBIAN_FRONTEND=noninteractive; \
echo mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD | debconf-set-selections; \
echo mysql-server mysql-server/root_password_again password $MYSQL_ROOT_PASSWORD | debconf-set-selections;
RUN apt-get update && apt-get install -y -q mysql-server php5-mysql nginx wget
EXPOSE 80 3306
VOLUME ["/var/www", "/etc/nginx", "/var/lib/mysql", "/var/log"]
一切正常,预计我的所有文件夹在我的主机卷中都是空的。我想在我的文件夹中查看 nginx conf 和 mysql 数据。
我做错了什么?
编辑 1: 实际上问题是我希望 docker-compose 在我的 docker 目录中创建该卷(如果它不存在),如果它存在则使用该卷,正如 https://stackoverflow.com/a/39181484 中所解释的那样。 .但这似乎不起作用。
最佳答案
问题在于您希望将容器中的文件挂载到您的主机上。
这不是它的工作方式:它是相反的方式:
Docker 将您的主机文件夹安装在您指定的容器文件夹中。 如果你进入容器,你会看到应该有初始化文件的地方,什么都没有(或者你的主机文件夹中的任何东西),你可以在文件夹中写一个文件,它会出现在您的主机上。
获取初始化文件并为您的容器修改它们的最佳选择是:
- 在不挂载文件夹的情况下创建容器(原始容器数据将在那里)
- 运行容器(容器会在正确的位置保存nginx等安装的文件...)
docker run <image>
- 使用
docker cp <container>:<container_folder>/* <host_folder>
将文件从容器中复制出来 - 现在您在主机上拥有来自容器 init 的“原始”文件。
- 根据容器的需要修改文件。
- 运行容器,装载您的主机文件夹,其中包含新文件。
注意事项:
您可能想使用外壳( docker run -it <image> /bin/sh
)进入容器并压缩所有文件夹以确保如果有嵌套文件夹,您会得到所有内容,然后是 docker cp ...
压缩包
另外,请注意文件系统是否区分大小写:在 linux 上,文件区分大小写。在 Mac OS X 上,它们不是。所以如果你有 Init.conf
和 init.conf
在同一个文件夹中,当您将它们复制到 Mac OS X 主机时,它们会发生冲突。
关于docker-compose 卷即使从初始化也是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42395748/