Невозможно использовать переменную ENV из контейнера Docker для выполнения HEALTHCHECKS в файле docker -compose - PullRequest
0 голосов
/ 28 января 2020

У меня есть docker -компонентный файл со службой базы данных, который получает файл среды для пользователей и паролей (я удалил переменную env для пароля, так как проблема одинакова как для пользователя, так и для пароля):

db:
    restart: always
    container_name: db
    image: mariadb:10.3.9
    env_file:
      - my_env_file.env
    volumes:
      - /opt/dbdata:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysql", "-u", "${DB_USER}", "-e", "\"SHOW DATABASES;\""]
      interval: 1m
      timeout: 10s
      retries: 10

Файл среды содержит запись DB_USER:

DB_USER=TEST

При сборке и запуске контейнера с docker -compose переменная среды не может быть разрешена с помощью Docker, поскольку переменная существует только в контейнере db, и я получаю следующее предупреждение:

WARNING: The DB_USER variable is not set. Defaulting to a blank string.

Есть ли способ указать Docker, чтобы избежать разрешения значение этой переменной env на хосте, но вместо этого разрешить его из моего контейнера?

I не хочу предоставлять переменную env на хосте из соображений безопасности.

Я также не хочу, чтобы использовал mysqladmin, поскольку это может привести к ложным срабатываниям (например, проверка работоспособности может завершиться ошибкой, поскольку база данных еще не принимает соединения).

Ответы [ 2 ]

1 голос
/ 28 января 2020

docker -compose развернет переменные среды в среде docker -compose (где вы выполнили команду docker -compose), а не в среде контейнера. Переменные среды, которые вы передаете, устанавливаются только внутри контейнера (файл компоновки уже проанализирован, а переменные в файле компоновки были расширены к моменту загрузки файла переменной среды).

Внутри контейнера a shell необходим для расширения переменных окружения ($ - это синтаксис оболочки, ядро ​​Linux не делает этого расширения), но вам нужно экранировать эти переменные, чтобы docker -compose не пытался сначала разверните их, и вам нужна оболочка. Синтаксис списка json для запуска команд в контейнерах docker выполняется с прямым системным вызовом exe c ОС, минуя оболочку, поэтому вам нужно либо явно добавить оболочку к синтаксису exe c, либо просто использовать синтаксис оболочки В последнем случае значения $, экранированные как $$, приводят к:

test: ["CMD-SHELL", "mysql -u $${DB_USER} -e \"SHOW DATABASES;\""]

Подробнее см .:

1 голос
/ 28 января 2020
Опция

env_file может использоваться только для установки переменных среды внутри контейнера.

Для замены переменных в файле компоновки, есть две опции -

  1. Переменные среды оболочки - Compose может использовать значения переменных из среды оболочки, в которой выполняется docker -compose.

  2. .env file - Compose поддерживает объявление по умолчанию Переменные среды в файле среды с именем .env, помещенном в папку, в которой выполняется команда docker -compose. Переменные среды в оболочке переопределяют значения в файле .env.


Если ни один из перечисленных выше вариантов не работает для вас, вы можете попробовать следующие подходы -

  1. Запустить сценарий оболочки, внутри которого переменные среды контейнера называются проверкой работоспособности.

  2. Экранируйте переменные двойным знаком доллара.

test: ["CMD-SHELL", "mysql -u $${DB_USER} -e \"SHOW DATABASES;\""]

...