如何在文本文件中传递和访问环境变量

时间:2018-03-07 06:20:08

标签: linux docker

我想将环境变量传递给文本文件。

使用案例

我正在从Dockerfile构建一个docker镜像并运行一个使用文本文件的java命令。该文本文件包含一些我想使用环境变量传递的关键字。

DockerFile:

FROM openjdk:8u151-jdk-alpine3.7

WORKDIR /sink

COPY kafka-connect-cli-1.0.6-all.jar /sink

COPY cassandra-sink-distributed-orders.properties /sink

CMD ["sh", "-c", "java -jar kafka-connect-cli-1.0.6-all.jar create cassandra-sink-casb < cassandra-sink-distributed-orders.properties"]

cassandra-sink-distributed-orders.properties是文本文件。

Cassandra-sink-distributed-orders.properties:

name=cassandra-sink-casb
connector.class=com.datamountaineer.streamreactor.connect.cassandra.sink.CassandraSinkConnector
tasks.max=1
topics=topic1
connect.cassandra.kcql=INSERT INTO table1 SELECT * FROM topic1;
connect.cassandra.port=9042
connect.cassandra.key.space=casb
connect.cassandra.contact.points=cassandra
connect.cassandra.username=cassandra
connect.cassandra.password=cassandra

在此文本文件中,我想使用环境变量传递connect.cassandra.usernameconnect.cassandra.passwordconnect.cassandra.key.space

这是我的docker-compose文件:

cassandra-sink:
    container_name: cassandra-sink
    image: casb-cassandra-sink:0.1
    #build:
    #  context: ./cassandra-sink
    #  dockerfile: Dockerfile
    depends_on:
      cassandra:
        condition: service_healthy
    depends_on:
      kafka-connect:
        condition: service_healthy
    links:
      - kafka
      - kafka-connect
      - cassandra
    environment:
      - KAFKA_CONNECT_REST=http://kafka-connect:8083

3 个答案:

答案 0 :(得分:2)

您需要定义文本文件的file format。您可能决定使用某些现有格式,例如JSONYAML等,或者创建自己的格式。在后一种情况下,您应该记录您的文件格式,可能使用EBNF表示法。您还会记录与该格式相关的semantics(至少用英文)。

一旦定义了文件格式,就需要解析它。有标准parsing技术,特别是recursive descent parsers(如果您使用现有格式,如JSON,您会发现许多现有的库处理它。)

  

我想将环境变量传递给文本文件。

Stricto sensu,这没有任何意义。文本文件只是解析为某些文本的字节序列。您可以将环境变量传递给程序(而不是文件)。

也许您可以使用shell script编写一些here documents来在脚本中生成该文本文件(或者在 stdin 上将其提供给您的程序),然后运行该shell您CMD的{​​{1}}行中的脚本。

也许你的解析器可能有一些约定来处理某些符号,以获得一些环境变量。您将使用getenv(3)(或编程语言中的任何等效语言)。

您需要熟悉基本的解析概念和技术。所以请阅读一本好的“编译器书”,例如Dragon Book

您也可以考虑在程序中嵌入解释器(查看scripting languages for Java)。

答案 1 :(得分:2)

您可以将环境变量放在属性文件中,但linux不会自动将它们识别为环境变量,因此无法解析它们。

root@ubuntu:/home# cat a.properties
abc=$abc
xyz=$xyz

为此,您必须解析值。

如果尚未定义env变量,只需进行导出

root@ubuntu:/home# export abc=1234
root@ubuntu:/home# export xyz=5678

现在使用以下命令替换属性文件中的env变量,并将其另存为另一个已解析env变量的属性文件。

root@ubuntu:/home# envsubst < a.properties > b.properties

您可以在b.properties文件中查看结果:

root@ubuntu:/home# cat b.properties
abc=1234
xyz=5678

答案 2 :(得分:1)

你可以创建一个&#34; .env&#34;上述属性文件的文件,并将其传递到docker compose文件中,如下所示:

web:
  env_file:
    - properties.env