如何从图像创建数据卷以在 nginx 容器中使用

how to create data volume from image for use in nginx container

我有一个图像(不是容器),它在 /store 中烘焙了数据。该图像不做任何其他事情,它只是一个用于保存数据的容器。我想创建一个 docker-compose 文件,以便我的 nginx 容器可以访问 /store at /usr/share/nginx/html 中的所有内容

需要先做一个中间容器吗?我不确定 docker-compose 文件的外观。谢谢

最好的管理方法可能是使用 docker 卷来存储您的 /store 数据。 您可以通过从该映像创建一个容器来完成一次,在其中安装一个空的 docker 卷,然后将 /store 的内容复制到外部 docker 卷中。

如果您仍然需要使用现有图像中的 /store,您将需要从 if 中实例化一个容器,并从您的 nginx 容器中检索暴露的卷。 (使用 volume_from)。在这种情况下,两个容器都需要在同一台主机上。

您可以尝试使用 local-persist volume plugin 如下:

version: '2'
services:
  web:
    image: nginx
    volumes:
      - data:/usr/share/nginx/html 
volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data

显然,其他卷插件类型可能会提供更大的灵活性。

https://docs.docker.com/engine/extend/plugins/

我建议您考虑在您的 nginx 容器中烘焙 /store。它将减少安装卷的数量,从而简化整体结构。并且可能会提高性能。

您可以通过多种方式做到这一点:

  1. 使用您的数据映像作为您的 nginx 映像的基础。在这种情况下,您需要为 nginx 编写 Dockerfile,但这并不难。

  2. 您可以通过创建具有 true 端点和 docker cp 所需数据的容器,从数据映像中提取 /store。然后复制到你的nginx镜像中。

这是一个快速步骤:

docker run -v nginx-store:/store --rm store true

docker run -v nginx-store:/usr/share/nginx/html -d --name nginx nginx

第一个 运行 从您的 store 映像的内容创建一个命名卷 nginx-store(只要您在容器中安装一个空卷,就会发生这种情况),然后立即退出并删除容器。

第二个 运行 将该命名卷与未来的 nginx 容器一起使用。要在将来修改 nginx-store 卷,您可以 运行 任何使用类似 -v nginx-store:/target 标志安装它的侧容器。