首页 > 解决方案 > 通过 nomad 在 docker 中安装卷

问题描述

我正在尝试通过 nomad 运行 docker 容器。该作业规范旨在运行带有 java docker 映像的 docker 容器。来自 localhost 路径的卷应该安装到 docker 容器上。该卷将包含一些 java 文件。容器应按照命令指定的方式编译 java 文件。

期望:应该完成java程序的编译,并且应该在容器和我的本地主机路径中创建一个类文件。

工作规范文件:

job "java" {
  datacenters = ["dc1"]
  type = "service"
  
  update {
    max_parallel = 1
    healthy_deadline = "3m"
    progress_deadline = "10m"
    auto_revert = false
    canary = 0
  }

  migrate {
    max_parallel = 1
    health_check = "checks"
    min_healthy_time = "10s"
    healthy_deadline = "5m"
  }

  group "compile" {
    count = 1
    
    service {
      name = "java-compile"
      tags = ["java", "compile"]
    }
    
    restart {
      attempts = 2
      interval = "30m"
      delay = "15s"
      mode = "fail"
    }

    ephemeral_disk {
      size = 300
    }

    task "java" {
      driver = "docker"

      config {
        image = "adoptopenjdk/openjdk11"
        mount {
          type = "bind"
          target = "/java"
          source = "/home/ninan/nomad/java"
          readonly = false
          bind_options {
            propagation = "rshared"
          }
        }
        work_dir = "/java"
        command = "javac Hello.java"
      }


      resources {
        cpu    = 500 # 500 MHz
        memory = 1024 # 256MB
      }
    }
  }
}

目前它没有说volumes are not enabled; cannot mount host path: "/home/ninan/nomad/java"

附上日志的相关部分:

    2021-08-18T19:09:54.818+0530 [INFO]  client.alloc_runner.task_runner.task_hook.logmon.nomad: opening fifo: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8 task=java @module=logmon path=/tmp/NomadClient304008624/f2774019-4135-28f8-9a91-24f6a7c0dbf8/alloc/logs/.java.stdout.fifo timestamp=2021-08-18T19:09:54.818+0530
    2021-08-18T19:09:54.819+0530 [INFO]  client.alloc_runner.task_runner.task_hook.logmon.nomad: opening fifo: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8 task=java @module=logmon path=/tmp/NomadClient304008624/f2774019-4135-28f8-9a91-24f6a7c0dbf8/alloc/logs/.java.stderr.fifo timestamp=2021-08-18T19:09:54.819+0530
    2021-08-18T19:09:55.310+0530 [WARN]  client.alloc_runner.runner_hook.alloc_health_watcher: error looking up Consul registrations for allocation: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8 error="failed to retrieve services from consul: Get "http://127.0.0.1:8500/v1/agent/services": dial tcp 127.0.0.1:8500: connect: connection refused" alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8
    2021-08-18T19:10:08.094+0530 [ERROR] client.driver_mgr.docker: failed to create container configuration: driver=docker image_name=adoptopenjdk/openjdk11 image_id=sha256:af4af705169ddd5b5c49b64634bc7a09ac000f90ba8e5e49dd9d7cb61c5d2bb8 error="volumes are not enabled; cannot mount host path: "/home/ninan/nomad/java" "/tmp/NomadClient304008624/f2774019-4135-28f8-9a91-24f6a7c0dbf8""
    2021-08-18T19:10:08.094+0530 [ERROR] client.alloc_runner.task_runner: running driver failed: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8 task=java error="Failed to create container configuration for image "adoptopenjdk/openjdk11" ("sha256:af4af705169ddd5b5c49b64634bc7a09ac000f90ba8e5e49dd9d7cb61c5d2bb8"): volumes are not enabled; cannot mount host path: "/home/ninan/nomad/java" "/tmp/NomadClient304008624/f2774019-4135-28f8-9a91-24f6a7c0dbf8""
    2021-08-18T19:10:08.095+0530 [INFO]  client.alloc_runner.task_runner: not restarting task: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8 task=java reason="Error was unrecoverable"
    2021-08-18T19:10:08.095+0530 [INFO]  client.gc: marking allocation for GC: alloc_id=f2774019-4135-28f8-9a91-24f6a7c0dbf8

Nomad 服务器启动为 -

sudo nomad agent -dev -bind 0.0.0.0 -log-level INFO 

我该怎么做才能启用卷安装?

标签: dockernomad

解决方案


您应该首先在 nomad 启动之前创建卷路径,然后在您的client.hcl文件中添加以下配置:

host_volume "database-data" {
    path = "/srv/live/postgres-database/data/"
    read_only = false
}

然后在您的工作规范中,在该group节中定义音量:

volume "database-data" {
     type      = "host"
     read_only = false
     source    = "database-data"
}

然后最后在task使用定义的卷的节中添加以下内容:

volume_mount {
      volume      = "database-data"
      destination = "/var/lib/postgresql/data" #<-- in the container
      read_only   = false
}

有关更多详细信息,您可以使用https://www.nomadproject.io/docs/job-specification/volume

我希望我有所帮助


推荐阅读