我想将环境变量传递给文本文件。
使用案例
我正在从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.username
,connect.cassandra.password
和connect.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
答案 0 :(得分:2)
您需要定义文本文件的file format。您可能决定使用某些现有格式,例如JSON或YAML等,或者创建自己的格式。在后一种情况下,您应该记录您的文件格式,可能使用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