【问题标题】:docker does not create folder in nginx html rootdocker 不在 nginx html 根目录中创建文件夹
【发布时间】:2016-09-16 16:38:40
【问题描述】:

我正在尝试创建一个 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,但我遇到了同样的问题。

【问题讨论】:

  • 当您将文件夹从主机挂载到容器时,主机文件夹内容优先,您将看不到在挂载之前创建的容器文件夹。
  • 现在很有意义..

标签: nginx docker docker-compose centos7


【解决方案1】:

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

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

所以你的 3 个选项是:

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

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

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

【讨论】:

  • 我现在了解主机卷挂载覆盖映像文件夹的问题。对于我的设置,一旦容器运行,我不需要修改我的 html 根目录的内容。我只需要公开 html 根目录的内容。从您的解释看来,选项 2) 是我需要的。当您说命名卷时,您的意思是在 Dockerfile 中使用 VOLUME?
  • 我忘了提到,一旦容器启动并运行,我需要能够读取/写入装载卷。
  • 如果您在 Dockerfile 中声明卷,默认情况下它不会有名称,但每次运行容器时都会创建一个匿名 guid 卷。我不推荐这个。如上所述,在 docker-compose.yml 中将卷源从 /www-data 更改为 www-data,它将为您创建一个命名卷。如果您不希望特定容器对卷具有 rw 访问权限,则可以在卷挂载结束时指定 :ro
  • 错误:在服务“wbh-device-asset-server”中使用了命名卷“www-data:/var/wwwi/html:rw”,但在卷部分未找到声明。
  • 我在我的 Dockerfile 中添加了一个 volumes: 部分来解决错误。我假设如果我想备份挂载内容,我会从源路径(在 docker inspect 输出中找到)归档 _data 文件夹的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 2021-11-24
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多