Отображение переменных среды в JSON с помощью JQ внутри докера

#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. Так что спасибо Чарльзу Даффи!