使用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在这方面的工作方式不同吗?
使用具有以下配置的命名卷可以解决此问题:
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
应该没有区别,卷正在将本地目录挂载到容器中的目录。要么你没有正确安装,要么你在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安装主机目录,因为构建的映像应该是可移植的。主机目录在所有潜在主机上都不可用。
如果要在容器之间共享某些持久性数据,或者想要从非持久性容器中使用,则最好创建一个命名的数据卷容器,然后从中装入数据。
在尝试创建卷以将我自己的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