docker-compose 卷即使从初始化也是空的

标签 docker docker-compose dockerfile

我尝试为不同的网站创建一个 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.confinit.conf在同一个文件夹中,当您将它们复制到 Mac OS X 主机时,它们会发生冲突。

关于docker-compose 卷即使从初始化也是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42395748/

相关文章:

laravel - 在Docker容器中运行Laravel应用,但autoload.php文件不存在

c# - 运行 Docker 时无法识别命令

dockerfile - 如何在 alpine :3. 9 上安装 Node 8.15?

ssl - 获取网络/http : TLS handshake timeout when run golang app on docker container host

docker - 如何列出来自自托管 Gitlab 服务器的所有 docker 图像的名称

php - 如何正确设置数据卷容器?

mysql - Docker - 如何更改我的 Docker Compose 文件以自动化 MySQL 容器的 bash 脚本?

postgresql - 如何在 docker-compose 处理的 postgres docker 容器中运行 psql 命令?

django - 是否有人将 django celery worker 实现为 docker 容器,它仅在分配任务时运行

linux - 如何通过 docker cp 复制目录?