【问题标题】:Configure environment variable with Neo4j and docker-compose使用 Neo4j 和 docker-compose 配置环境变量
【发布时间】:2018-06-19 11:43:05
【问题描述】:

我将我的应用程序打包到 jar 中,并使用 bash 脚本(执行 jar)通过 Docker 运行它。我想在 docker-compose 文件中将 neo4j 数据库 url 配置更改为环境变量,但是,我仍然收到此错误:

Exception in thread "main" com.typesafe.config.ConfigException$NotResolved: neo4j.url has not been resolved, you need to call Config#resolve(), see API docs for Config#resolve()

我该如何解决这个问题,我应该在哪里添加一些配置?

我只在配置文件中设置了 url 变量:

neo4j{
    url= "bolt://localhost:7687"
    url = ${?HOSTNAME}
    user = "user"
    password = "password"
}

另外,我在配置方法中使用了这个变量:

  def getNeo4jConfig(configName: String) = {
    val neo4jLocalConfig = ConfigFactory.parseFile(new File("configs/local_neo4j.conf"))
    neo4jLocalConfig.resolve()

    val driver = configName match {
      case "neo4j_local" => GraphDatabase.driver(neo4jLocalConfig.getString("neo4j.url"),
        AuthTokens.basic(neo4jLocalConfig.getString("neo4j.user"), neo4jLocalConfig.getString("neo4j.password")))
      case _ => GraphDatabase.driver("url", AuthTokens.basic("user", "password"))
    }

    driver.session
  }

在 docker-compose.yml 我定义了主机名的值:

version: '3.3'
services:
  neo4j_db:
    image: neo4j:latest
    ports:
      - "7474:7474"
      - "7473:7473"
      - "7687:7687"
    volumes:
      - $HOME/neo4j/import:/var/lib/neo4j/import
      - $HOME/neo4j/data:/neo4j/data
      - $HOME/neo4j/conf:/neo4j/conf
      - $HOME/neo4j/logs:/neo4j/logs
    environment:
      - NEO4J_dbms_active__database=graphImport.db
  benchmarks:
    image: "container"
    volumes:
      - ./:/workdir1
    working_dir: /workdir1
    links:
      - neo4j_db
    environment:
      - HOSTNAME=myhoat

另外,bash 脚本如下所示:

#!/usr/bin/env bash
for run in {1..2}
do
    java -cp "target/scala-2.11/benchmarking.jar" benchmarks/Main $1 $2
done

【问题讨论】:

    标签: docker neo4j docker-compose environment-variables


    【解决方案1】:

    将这些环境设置在一个.env 文件中,与您的位置相同 docker-compose.yml 文件:

    .env

    VAR1=value
    VAR2=2.0
    VAR3=`awk -F ':' '{if ($3 == 1000) {print $1}}' /etc/passwd` <-- any bash command, for example
    ...
    

    例如,在您的撰写文件部分中使用它们:

    docker-compose.yml

    ...
      build:
        dockerfile: Dockerfile_${VAR2}
    ...
    

    【讨论】:

    • 我应该向 Dockerfile 本身添加一些环境吗?
    • 是的,您可以将它们添加到 Dockerfile 中,但 dockerfile 中定义的 ENV 仅可用于入口点。如果您在 docker-compose.yml 文件的environment: 部分中设置它们,则相同
    【解决方案2】:

    我在 Dockerfile 中将主机名定义为 arg,然后在 docker-compose 文件中为应用程序构建定义了它。这样就解决了问题!

    Docker 编写文件:

    version: '3.3'
    services:
      benchmarks-app:
        build:
          context: .
          dockerfile: Dockerfile
          args:
            - HOST=neo4jdb
        volumes:
          - ./:/workdir
        working_dir: /workdir
    

    Dockerfile 参数定义:

    FROM java:8
    ARG HOST
    ENV SCALA_VERSION 2.11.8
    ENV SBT_VERSION 1.1.1
    ENV SPARK_VERSION 2.2.0
    ENV SPARK_DIST spark-$SPARK_VERSION-bin-hadoop2.6
    ENV SPARK_ARCH $SPARK_DIST.tgz
    ENV NEO4J_CONFIG $DB_CONFIG
    ENV BENCHMARK $BENCHMARK_NAME
    ENV HOSTNAME bolt://$HOST:7687
    ...
    

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 2022-11-10
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2019-11-01
      相关资源
      最近更新 更多