Команда файла $cat не работает при передаче в качестве файла среды в команду запуска Docker

У меня есть очень большой файл, который нужно передать как переменную среды в команду запуска Docker на платформе linux ec2.

Моя идеальная команда докера выглядит так:

docker run -p 6080:9000 -e KAFKA_BROKERCONNECT=url:port -e KAFKA_TRUSTSTORE="$(cat directory/kafka.client.truststore.jks | base64)" -e KAFKA_KEYSTORE="$(cat directory/kafka.client.keystore.jks | base64)" -e KAFKA_PROPERTIES="$(cat directory/kafka.properties | base64)" -e SERVER_SERVLET_CONTEXTPATH="/" -d obsidiandynamics/kafdrop

Я получаю /bin/docker : слишком длинный список аргументов

Поэтому вместо того, чтобы делать вышеописанное, я передал все переменные Env из файла kafdrop-properties, который выглядит так:

KAFKA_BROKERCONNECT=host:port
KAFKA_TRUSTSTORE="$(cat 2kafka.client.truststore.jks)"
KAFKA_KEYSTORE="$(cat 2kafka.client.keystore.jks)"
KAFKA_PROPERTIES="$(cat /home/de601928/kafka/kafka.properties | base64)

и соответствующую команду запуска Docker:

docker run -p 6080:9000 --env-file kafdrop-properties -d obsidiandynamics/kafdrop

Теперь, после запуска команды, я все еще вижу, что переменные среды, такие как KAFKA_TRUSTSTORE, не читаются через содержимое cat и отображаются так, как есть, когда я запускаю docker exec env.

Почему команда cat не читает файл и не передает значение в качестве аргумента переменной среды.

Я пробовал разные способы, такие как предоставление ‹file и т. д. Здесь ценю любую помощь.


person DEEPAK R.L.    schedule 03.11.2020    source источник
comment
Вы export эти переменные? Кроме того, как выглядят строки, которые генерируются cat directory/kafka.client.truststore.jks | base64 и тому подобным? с base64 они не должны включать пробелы, что затрудняет понимание сообщения об ошибке ...   -  person tink    schedule 03.11.2020


Ответы (1)


Это происходит потому, что docker использует упрощенный механизм анализа файлов .env, как описано здесь< /а>. Переменные анализируются только при прямой ссылке, а команды не поддерживаются.

РЕДАКТИРОВАТЬ:

Использование docker-compose должно работать примерно так:

Ваш docker-compose.yml файл

version: '3'
services:
  my-service:
    image: obsidiandynamics/kafdrop
    environment:
      - KAFKA_BROKERCONNECT
      - KAFKA_TRUSTSTORE
      - KAFKA_KEYSTORE
      - KAFKA_PROPERTIES
    ports:
      - 6080:9000

Затем запустите

eval $(egrep -v '^#' .env | xargs) && docker-compose up

Что должно произойти, так это то, что первая часть команды проанализирует файл и установит переменные, а затем будет запущена команда docker-compose с оценкой этих переменных.

Теперь, установив раздел среды docker-compose.yml, как указано выше, эти конкретные переменные будут переданы из оболочки в контейнер.

person Milan Markovic    schedule 03.11.2020