docker不会在nginx html root中创建文件夹

时间:2016-09-16 16:38:40

标签: nginx docker docker-compose centos7

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

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

FROM nginx

MAINTAINER Carl Wainwright <carl.wainwright@ipaccess.com>

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

在我的docker-compose文件中,我按如下方式创建容器:

  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,我遇到了同样的问题。

1 个答案:

答案 0 :(得分:3)

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

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

所以你的3个选项是:

  1. 根本不使用卷,您的文件将可见。如果要在容器之间保留此数据,不建议使用。

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

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