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

标签 nginx docker docker-compose centos7

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

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

FROM nginx

MAINTAINER Carl Wainwright <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="05666477692b72646c6b72776c626d71456c756466666076762b666a68" rel="noreferrer noopener nofollow">[email protected]</a>>

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

最佳答案

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

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

所以你的 3 个选择是:

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

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

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

关于nginx - docker 不会在 nginx html 根目录中创建文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536385/

相关文章:

linux - nginx 将所有页面 301 重定向到另一个域/主页添加查询字符串

javascript - 使用 nginx/node 进行版本控制来提供静态文件的最佳方式

namespaces - 是否可以将 ipc namespeces 与 docker compose 连接起来

java - 从 Docker 容器将 Log4j2 日志写入远程服务器会出错

docker - 无法将 docker url 与 PHP 单元连接

Docker-compose .env 文件内部变量替换

nginx - 如何在 nginx 代理后面使用 Unix 域套接字托管 ASP.NET Core 2.0 (Kestrel)?

nginx - Nginx + php-fpm 上的 Roundcube

c - 编译包含 aarch64 的 C 库的 Rust crate 时遇到问题

postgresql - 如何使用 docker-compose 设置 postgres 的服务器名称?