#json #bash #docker #jq
Вопрос:
Я бьюсь головой о стену уже 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. Я нашел эту маленькую хитрость: 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
Но когда я добавляю ту же строку в сценарий bash, который выполняется внутри контейнера docker, я получаю следующее сообщение об ошибке:
jq: error: ENV/0 is not defined at <top-level>, line 1:
with_entries( .value = ($ENV."(.value)" // .value ) )
jq: 1 compile error
Из того, что я могу понять об ошибке, кажется, что она не может расширить переменную ENV, но ПОЧЕМУ?!
Если у кого-нибудь есть какие-либо идеи о том, что я делаю не так, пожалуйста, помогите.
Комментарии:
1. Какая версия jq присутствует в вашем контейнере? Если один в вашем хосте достаточно новый, чтобы его иметь
ENV
, но нет в контейнере, есть ваша проблема-это относительно недавняя функция.2. Хорошая идея. Проверю как можно скорее.
3. Вы экспортировали переменные или просто объявили их?
4. Экспорт. Это была та версия, на которую указал Чарльз. Это всегда самый очевидный ответ. Скоро мы обновим его ответ!
5. кстати, если вы хотите экспортировать объекты только для одной команды,
var1=value1 var2=value2 somecommand
выполняемые как одна команда (без новых строк или других разделителей команд) будут экспортироватьсяvar1
иvar2
в средеsomecommand
без изменения среды других/более поздних команд.
Ответ №1:
Ответ был достаточно прост. Нужно было иметь версию 1.6 внутри docker. Чтобы иметь возможность сделать это, мне нужно было установить epel-release-latest-7.noarch.rpm перед установкой jq. В противном случае он установил 1.5 версию jq. Так что спасибо Чарльзу Даффи!