Nginx Docker卷空了

问题描述 投票:0回答:2

使用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
2个回答
0
投票

应该没有区别,卷正在将本地目录挂载到容器中的目录。要么你没有正确安装,要么你在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.yml中包含完整路径:

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安装主机目录,因为构建的映像应该是可移植的。主机目录在所有潜在主机上都不可用。

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


0
投票

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

我通过使用自己的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
© www.soinside.com 2019 - 2024. All rights reserved.