首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在文本文件中传递和访问环境变量

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

Stack Overflow用户
提问于 2018-03-07 06:20:07
回答 3查看 4.1K关注 0票数 2

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

用例:

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

DockerFile:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

,这是我的停靠-撰写文件:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2018-03-07 06:27:07

您需要定义文本文件的文件格式。您可能决定使用一些现有的格式,如JSONYAML等.或者自己发明一个。在后一种情况下,您应该记录您的文件格式,也许使用EBNF表示法。您还将记录与该格式相关的语义学 (至少用英语)。

一旦定义了文件格式,就需要解析它。有一些标准的解析技术,特别是递归下降分析器 (如果您使用现有格式(如JSON,您会发现许多现有的库处理它)。

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

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

也许您可以使用shell脚本编写一些这里的文件,在脚本中生成文本文件(或者将它提供给您的程序在stdin上),并在DockerfileCMD行中运行该shell脚本。

也许您的解析器有一些约定来处理一些符号,作为获取一些环境变量的意义。为此,您将使用getenv(3) (或编程语言中的任何等效项)。

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

您还可以考虑在程序中嵌入一个解释器(查看Java脚本语言)。

票数 2
EN

Stack Overflow用户

发布于 2018-03-07 09:12:53

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

代码语言:javascript
复制
root@ubuntu:/home# cat a.properties
abc=$abc
xyz=$xyz

为了做到这一点,您必须解析这些值。

如果env变量尚未定义,只需执行导出即可。

代码语言:javascript
复制
root@ubuntu:/home# export abc=1234
root@ubuntu:/home# export xyz=5678

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

代码语言:javascript
复制
root@ubuntu:/home# envsubst < a.properties > b.properties

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

代码语言:javascript
复制
root@ubuntu:/home# cat b.properties
abc=1234
xyz=5678
票数 2
EN

Stack Overflow用户

发布于 2018-03-07 06:40:39

您可以为上述属性文件创建一个".env“文件,并将其传递到您的停靠器组合文件中,如下所示:

代码语言:javascript
复制
web:
  env_file:
    - properties.env
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49145406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档