即使从初始化,docker-compose音量也是空的

问题描述 投票:5回答:1

我对docker很新,我尝试为不同的网站创建一个docker-compose图像。

除了我的卷外,一切都很好。

这是一个docker-compose的例子:

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"

这是我的docker文件:

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和mysl数据。

我究竟做错了什么?

谢谢你的帮助。

编辑1:实际上问题是我希望docker-compose在我的docker目录中创建卷(如果它不存在),并且如果它存在则使用该卷,如https://stackoverflow.com/a/39181484中的解释。但它似乎不起作用。

docker docker-compose dockerfile
1个回答
11
投票

问题是您希望Container中的文件安装在您的主机上。

这不是它的工作方式:它是另一种方式:

Docker将您的主机文件夹安装在您指定的容器文件夹中。如果你进入容器,你会看到应该有init文件的地方,什么都没有(或者你的主机文件夹中有什么),你可以在文件夹中写一个文件,它会出现在您的主机上。

获取init文件并为容器修改它们的最佳选择是:

  • 创建一个容器而不安装文件夹(原始容器数据将在那里)
  • 运行容器(容器将安装nginx等文件放在正确的位置......)docker run <image>
  • 使用docker cp <container>:<container_folder>/* <host_folder>将文件复制出容器
  • 现在,您拥有主机上容器init的“原始”文件。
  • 根据容器的需要修改文件。
  • 运行装载主机文件夹的容器,其中包含新文件。

注意:您可能想要使用shell(docker run -it <image> /bin/sh)进入容器内部并压缩所有文件夹以确保在有嵌套文件夹的情况下获得所有内容,然后docker cp ...压缩文件

另外,请注意文件系统区分大小写:Linux文件区分大小写。在Mac OS X上,它们不是。因此,如果您在同一文件夹中有Init.confinit.conf,则在将它们复制到Mac OS X主机时会发生冲突。

© www.soinside.com 2019 - 2024. All rights reserved.