【问题标题】:Volume mounting with docker stack使用 docker stack 进行卷安装
【发布时间】:2018-10-19 02:51:03
【问题描述】:

以下是我的 docker-stack 文件。

version: "3"
services:
  my-app:    
    image: my-image:latest    
    volumes:
      - ./certs:/certs   
    ports:
      - 6401:6401
    networks:
      my-net:        
         ipv4_address: 192.168.0.4
networks:
  my-net:
    external: true

它在我的机器上运行良好,将 certs 文件夹绑定到容器内的 certs。但是,在我在 docker-stack-node 映像中部署此服务的 CI 管道中不起作用。我得到的错误是

“绑定”类型的挂载配置无效:绑定挂载源路径不 存在。

我读到如果您将主机路径绑定到服务的容器中,则该路径必须存在于每个 swarm 节点上。所以,我想我需要创建一个命名卷。但是,使用命名卷我无法指定证书的源路径。这很令人困惑。有人可以帮忙吗?

【问题讨论】:

  • 我认为这与命名卷无关。我认为这特别与 CI 主机没有运行它的 certs 目录有关。我不确定为什么证书应该在已安装的卷上。证书是如何生成的?它们是每次 CI 运行时生成的,还是更像是存储在某个地方的秘密或工件?如果它们已生成,您可以添加另一个生成的图像 + 容器,或者您可以通过从秘密管理平台或工件中获取来添加它。
  • 这是存储在存储库中的工件(不是一个好的做法,但这些只是用于测试)。因此,当 CI 运行时,将在运行器上克隆存储库,然后将服务部署在运行器机器上。当我在 gitlab ci 文件中运行 ls 时,我可以在那里看到名为 certs 的目录。可能是docker执行目录不同?我正在使用另一个容器来复制这些文件吗?
  • @Niraj 你是怎么解决这个问题的?

标签: docker docker-compose docker-swarm docker-stack


【解决方案1】:

要绑定到目录,该目录必须存在于主机上,因此./certs 不存在于运行容器的主机上,所以...

如果你想绑定你需要运行的卷:

mkdir -p ./certs

在运行容器的机器上,它将工作。

它可以在您的机器上运行,因为该目录存在于本地。

复制目录到主机

scp -r /local/directory/ username@to_host:/remote/directory/

【讨论】:

  • 但是如何将证书的内容复制到这个新目录?似乎它不在主机目录中。
  • 谁能回答 Niraj 后续问题?
  • ssh 或 scp 到主机
【解决方案2】:

@Niraj 我也遇到了这个问题,并且发现每个节点都需要文件才能运行。在你的情况下,我会这样做:

  1. 在您的 Dockerfile 中创建 certs 文件夹
    • RUN mkdir /certs
  2. 更改 compose-file 以使用绝对路径
    • - $PWD/certs:/certs
  3. 将证书复制到容器中
    • docker cp <file_name> <container_id>:/certs

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 2023-03-12
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多