【问题标题】:Nginx Docker Volumes emptyNginx Docker 卷为空
【发布时间】:2019-02-11 05:53:26
【问题描述】:

使用 docker-compose 时,nginx 不会像其他图像那样显示文件。

以Mysql为例,下面的代码会将/var/lib/mysql创建的数据保存到本地机器./volumes/db/data

./volumes/db/data:/var/lib/mysql

另一个例子,使用 Wordpress,下面的代码会将在 /var/www/html/wp-content/uploads 创建的数据保存到本地机器 ./volumes/uploads/data

./volumes/uploads/data:/var/www/html/wp-content/uploads

这不适用于 nginx,所以无论我将 /some/nginx/path 更改为什么,它都不会出现在 ./volumes/nginx/data

./volumes/nginx/data:/some/nginx/path

nginx 在这方面的工作方式是否有所不同?


更新

使用具有以下配置的命名卷解决了这个问题:

  • 在 docker-compose 文件的 services 部分,我将 ./volumes/nginx/data:/some/nginx/path 更改为 nginx_data:/some/nginx/path

  • 然后我的volumes部分内容如下


volumes:
  nginx_data:
    driver: local
    driver_opts:
      o: bind
      device: ${PWD}/volumes/nginx/data

【问题讨论】:

    标签: mysql wordpress docker nginx volumes


    【解决方案1】:

    应该没有区别,一个卷正在将本地目录挂载到容器中的目录。要么您没有正确安装,要么您在 nginx 容器内安装了不正确的路径(nginx 不使用的路径)。

    根据https://docs.docker.com/samples/library/nginx/ 上的官方 nginx docker 镜像文档,您应该挂载到 /usr/share/nginx/html

    $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
    

    此外,我会在您的 docker-compose.yaml 中包含完整路径:

    volumes:
      - /full_path/volumes/nginx/data:/usr/share/nginx/html
    

    如果这仍然不起作用,您应该执行到容器中并确认目录已安装:

    $ docker exec -it <container_name> sh
    $ df -h | grep nginx
    
    # write data, confirm you see it on the docker host's directory
    $ cd /usr/share/nginx/html
    $ touch foo
    
    # on docker host
    $ ls /full_path/volumes/nginx/data/foo
    

    如果其中任何一个失败,我会查看 docker 日志以查看挂载目录是否存在问题,可能是路径或权限问题。

    $ docker logs <container_name>
    

    --- 更新 ---

    我运行了您正在使用的所有内容,并且效果很好:

    $ cat Dockerfile
    FROM nginx
    RUN touch /usr/share/nginx/html/test1234 && ls /usr/share/nginx/html/
    
    
    $ docker build -t nginx-image-test .; docker run -p 8889:80 --name some-nginx -v /full_path/test:/usr/share/nginx/html:rw -d nginx-image-test; ls ./test;
    ...
    
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    33ccbea6c1c1        nginx-image-test    "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:8889->80/tcp   some-nginx
    
    $ cat test/index.html
    hello world
    
    $ curl -i http://localhost:8889
    HTTP/1.1 200 OK
    Server: nginx/1.15.3
    Date: Thu, 06 Sep 2018 15:35:43 GMT
    Content-Type: text/html
    Content-Length: 12
    Last-Modified: Thu, 06 Sep 2018 15:31:11 GMT
    Connection: keep-alive
    ETag: "5b91483f-c"
    Accept-Ranges: bytes
    
    hello world
    

    -- 更新 2 -- 真棒你想通了,这篇文章似乎解释了为什么: docker data volume vs mounted host directory

    主机目录本质上是依赖于主机的。出于这个原因,您不能从 Dockerfile 挂载主机目录,因为构建的图像应该是可移植的。主机目录不会在所有潜在主机上都可用。

    如果您想要在容器之间共享一些持久性数据,或者想从非持久性容器中使用,最好创建一个命名的数据卷容器,然后从其中挂载数据。

    【讨论】:

    • 谢谢,这有助于解决我的问题,但我意识到我的问题与我的问题略有不同。我有我想在 /usr/share/nginx/html:rw 的容器上的数据,但是当卷挂载时,这些数据会消失。为了再次与 wordpress 图像进行对比,我可以将数据放在 /usr/src/wordpress/ 中,当 wordpress 安装卷时,它将出现在 /var/www/html/ 中。 nginx 是否有一个类似的文件夹,我可以在其中放置文件以便将它们挂载到 /usr/share/nginx/html ?
    • 您是否确认您在容器中有一个挂载点,并且您可以在容器中写入它并在主机上读取?接下来的故障排除步骤将取决于一切如何解决。你也在使用官方的 niginx 镜像吗?我会简单地尝试使用您的卷作为参数运行 docker,看看是否可行,避免使用 docker-compose 和任何其他外部内容。
    • 是的,我可以确认挂载点在容器上是可写的,在主机上是可读的。另外,可以使用官方的 nginx 镜像。我也得到了与 docker run 相同的结果。这一切都很好,但我想更进一步(但也许这是错误的方法)——有些文件是使用 RUN 命令下载的,一旦我挂载到该文件夹​​,这些文件就会消失。在 wordpress 版本中,我可以将文件下载到 /usr/src/wordpress,它们稍后会出现在 /var/www/html 所以我想对 nginx 做同样的事情
    • 它需要一个 dockerfile,这里是 -- Dockerfile -- FROM nginx RUN touch /usr/share/nginx/html/test1234 && ls /usr/share/nginx/html/ -- 命令行-- docker build -t nginx-image-test .; docker run --name some-nginx -v ~/test:/usr/share/nginx/html:rw -d nginx-image-test; ls ~/测试; -- 解释 -- 你会注意到 ~/test 是空的并且 test1234 不存在。它安装在原始 /usr/share/nginx/html 之上。使用 wordpress 图像,您可以将 test1234 放在其他位置,这样当 /usr/share/nginx/html 挂载到 ~/test 时,您将看到 test1234
    【解决方案2】:

    我在尝试创建一个卷以将我自己的 nginx 配置放入 etc/nginx 时也遇到了这个问题。虽然我从未发现真正的问题,但我认为这与 nginx 是如何从 Dockerfile 构建的有关。

    我通过使用自己的 Dockerfile 扩展原始文件并在构建时复制配置文件来解决了这个问题。希望这会有所帮助。

    FROM nginx:1.15.2
    
    COPY ./nginx.conf /etc/nginx/nginx.conf
    COPY ./global /etc/nginx/global
    COPY ./conf.d /etc/nginx/conf.d
    

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 2018-10-05
      • 1970-01-01
      • 2023-03-12
      • 2015-08-18
      • 2021-08-11
      • 1970-01-01
      • 2016-11-20
      相关资源
      最近更新 更多