2016-09-16 207 views
2

我正在尝试创建一个nginx docker容器(提供文件上传/下载)。 在html根目录下,我正在创建一些额外的子文件夹(上传和下载)。码头不会在nginx html根目录中创建文件夹

我把nginx docker镜像作为我的基础,并添加了一些额外的行来创建/初始化子文件夹。

FROM nginx 

MAINTAINER Carl Wainwright <[email protected]> 

ENV HTML_PATH /var/www/html 
COPY nginx.conf /etc/nginx/nginx.conf 

RUN mkdir -p $HTML_PATH/upload && mkdir -p $HTML_PATH/download 
RUN chmod 755 $HTML_PATH/upload && mkdir chmod 755 $HTML_PATH/download 
RUN chown nginx:nginx $HTML_PATH/upload && chown nginx:nginx $HTML_PATH/download 

在我的码头工人,撰写文件,我创造我的容器如下:

wbh-device-asset-server: 
    restart: always 
    image: wbh-device-asset-server/nginx:test 
    container_name: wbh-device-asset-server 
    volumes: 
    - /www-data:/var/www/html 
    ports: 
    - "8081:8081" 
    networks: 
    - mynetwork 

我的nginx的配置具有以下服务器配置。

server { 
    error_log /var/log/nginx/error.log debug; 
    access_log /var/log/nginx/access.log main; 

    # Running port 
    listen 8081; 

    # Proxy requests to get SDP's 
    location ~ \.sdp { 
     root /var/www/html; 

     try_files $uri =404; 

     limit_except GET   { deny all; } 
    } 

    # Proxy requests to put APD's. 
    location ~ \.(apd) { 

     dav_methods PUT; 
     limit_except PUT   { deny all; } 

     client_body_temp_path  /tmp/files/; 
     client_body_in_file_only on; 
     client_body_buffer_size 128K; 
     client_max_body_size  30M; 

    } 

在我的本地机器上存在/ www-data存在并具有写入权限。 每次我把容器放到/ www-data的内容都是空的。

为什么我无法在/ var/www/html /下创建文件夹?什么阻止我这样做。

注意:作为我的疑难解答的一部分,我创建了一个基于centos的docker镜像,并从软件包中安装了nginx,并面临同样的问题。

+0

当您从主机安装文件夹到容器时,主机文件夹内容盛行,并且在安装前您将看不到创建**的容器文件夹。 –

+0

现在是完美的感觉.. –

回答

3

Dockerfile创建一个图像,这是用来运行容器的定义,而不是容器本身,并且每个图像创建只运行一次。因此,所有RUN命令都会在那里发生,并用您期望的目录更新您的映像。

在您创建容器的docker-compose.yml中,您有一个主机卷装入。卷是在容器上执行的,而不是映像版本,所以在Dockerfile的RUN命令已经更新映像后,将挂载此目录。使用主机卷时,主机上该目录的内容完全覆盖图像的内容,它们不会被删除,但您将无法在具有该卷装载的任何容器中看到它们。如果您使用了一个命名卷,并且该命名卷恰好为空,例如在您第一次创建它之后,Docker会将图像目录的内容复制到卷中,然后再将其安装到容器中。

所以,你的3个选项是:

  1. 不要使用在所有的体积和您的文件将是可见的。如果你想在容器之间保存这些数据,不建议使用。

  2. 使用指定的卷。这可以像将音量源从完全限定的目录/www-data更改为名称www-data一样简单。如果你这样做,你将无法从主机轻松管理该文件夹的内容,Docker将通过它的内部目录结构来管理它,并且你想通过容器来管理它。

  3. 只需将所需文件添加到主机上的目录即可。这是您刚开始时最简单的解决方案,但请注意,主机上的用户可能与容器中的用户不匹配,因此您可能会看到需要使用chmodchown命令修复的权限和uid错误。

+0

我现在明白宿主卷挂载图像文件夹的问题。对于我的设置,一旦容器运行,我不需要修改我的html根目录的内容。我只需要公开html根目录的内容。从你的解释看来,选项2)是我所需要的。当你说命名卷时,你的意思是使用Dockerfile中的VOLUME? –

+0

我忘了提及我需要在容器启动并运行后读取/写入安装卷的功能。 –

+0

如果您在Dockerfile中声明了卷,默认情况下它不会有名称,但每次运行容器时都会创建一个匿名GUID卷。我不推荐这个。如上所述,在您的docker-compose.yml中将音量源从'/ www-data'改为'www-data',它将为您创建一个命名音量。如果您不希望该特定容器有权访问卷,则可以在卷安装结束时指定':ro'。 – BMitch