Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker不在nginx html根目录中创建文件夹_Nginx_Docker_Docker Compose_Centos7 - Fatal编程技术网

docker不在nginx html根目录中创建文件夹

docker不在nginx html根目录中创建文件夹,nginx,docker,docker-compose,centos7,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.con

我正在尝试创建一个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
我的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数据存在并具有写入权限。 每次我打开容器时,/www数据的内容都是空的

为什么我不能在/var/www/html/下创建文件夹?是什么阻止了我这么做


注意:作为故障排除的一部分,我基于centos创建了一个docker映像,并从软件包中安装了nginx。我遇到了相同的问题。

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

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

因此,您的3个选项是:

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

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

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


  • 将文件夹从主机装载到容器时,将以主机文件夹内容为准,并且您将看不到装载之前创建的容器文件夹。现在非常有意义。我现在了解了主机卷装载覆盖映像文件夹的问题。对于我的设置,容器运行后,我不需要修改html根目录的内容。我只需要公开html根目录的内容。从你的解释来看,选项2)似乎是我所需要的。当你说命名卷时,你是指使用Dockerfile中的卷吗?我忘了提到一旦容器启动并运行,我需要读/写装载卷的能力。如果你在Dockerfile中声明卷,默认情况下它没有名称,但每次运行容器时都会创建一个匿名guid卷。我不推荐这个。如上所述,在docker-compose.yml中将卷源从
    /www-data
    更改为
    www-data
    ,它将为您创建一个命名卷。如果不希望特定容器具有卷的rw访问权限,则可以在卷装载的末尾指定
    :ro
    。错误:命名卷“www-data:/var/wwwi/html:rw”用于服务“wbh设备资产服务器”但是在volumes部分中找不到声明。我在Dockerfile中添加了volumes:部分以解决此错误。我假设如果我想备份挂载内容,我会从源路径(在docker inspect output中找到)归档_data文件夹的内容。
    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;
    
        }