【发布时间】:2021-10-18 16:33:02
【问题描述】:
我已经用头撞墙了 8 个小时,但似乎无法解决这个问题。
我有一个像这样的 json:
{
"connector.class": "com.mongodb.kafka.connect.MongoSinkConnector",
"tasks.max": 1,
"key.converter": "org.apache.kafka.connect.storage.StringConverter",
"key.converter.schemas.enable": false,
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "CONNECTOR_SCHEMA_REGISTRY_URL",
"value.converter.schemas.enable": true,
"topics": "CONNECTOR_TOPICS",
"name": "CONNECTOR_NAME",
"connection.uri": "CONNECTOR_MONGODB_CONNECTION_URI",
"database": "CONNECTOR_MONGODB_DATABASE_NAME",
"collection": "CONNECTOR_MONGODB_COLLECTION_NAME",
"max.num.retries": 1,
"retries.defer.timeout": 5000,
"errors.log.include.messages": true,
"document.id.strategy":
"com.mongodb.kafka.connect.sink.processor.id.strategy.ProvidedInKeyStrategy",
"document.id.strategy.overwrite.existing": true,
"delete.on.null.values": true,
"post.processor.chain":
"com.az.ip.dmdp.commons.mongodb.kafka.connect.BsonOidProcessor,
com.az.ip.dmdp.commons.mongodb.kafka.connect.BsonTimestampProcessor",
"writemodel.strategy":
"com.mongodb.kafka.connect.sink.writemodel.strategy.UpdateOneTimestampsStrategy",
"transforms": "hoistKeyOid, hoistKeyId",
"transforms.hoistKeyOid.type": "org.apache.kafka.connect.transforms.HoistField$Key",
"transforms.hoistKeyOid.field": "oid",
"transforms.hoistKeyId.type": "org.apache.kafka.connect.transforms.HoistField$Key",
"transforms.hoistKeyId.field": "_id"
}
我正在尝试使用 jq 替换以 CONNECTOR 开头的值。我发现了这个小技巧:https://unix.stackexchange.com/questions/657466/how-to-update-given-environment-variable-values-in-json
它工作得很好,在我的终端上做了一个小的调整。只要在我的终端中设置了变量
jq 'with_entries( .value = ($ENV."\(.value)" // .value ) )' device-connectorbody.json
但是当我在 docker 容器内执行的 bash 脚本中添加同一行时,我收到以下错误消息:
jq: error: ENV/0 is not defined at <top-level>, line 1:
with_entries( .value = ($ENV."\(.value)" // .value ) )
jq: 1 compile error
根据我对错误的理解,它似乎无法扩展 ENV 变量,但是为什么?!
如果有人知道我做错了什么,请帮忙。
【问题讨论】:
-
您的容器中存在哪个版本的 jq?如果您的主机中的那个足够新,可以拥有
ENV,但容器中的那个不是,那就是您的问题 - 这是一个相对较新的功能。 -
好主意。会尽快检查。
-
你是导出变量还是仅仅声明它们?
-
导出。这是查尔斯指出的版本。这总是最明显的答案。很快就会更新他的答案!
-
顺便说一句,如果您只想为一个命令导出内容,
var1=value1 var2=value2 somecommanddone 作为单个命令(没有换行符或其他命令分隔符)将导出var1和var2在somecommand的环境中,无需修改其他/以后命令的环境。