В моем файле docker-compose как я могу установить две переменные env на одно и то же значение без двойного жесткого кодирования строки?

#docker #docker-compose #environment-variables

#docker #docker-compose #переменные среды

Вопрос:

Я пытаюсь создать контейнер Docker, в котором у меня есть две переменные среды, для которых установлено одно и то же значение. У меня есть

 version: "3.2"
services:

  sql-server-db:
    image: mcr.microsoft.com/mssql/server:latest
    ports:
      - 3900:1433
    env_file: ./tests/.test_env
    ...
    command: /bin/bash /my-app/my-script.sh
  

и затем в моем файле tests /.test_env у меня есть

 MY_DB_PASSWORD=reallylongpassword
SA_PASSWORD=${MY_DB_PASSWORD}
  

Я хотел бы установить переменные env «MY_DB_PASSWORD» и «SA_PASSWORD» на одно и то же значение, однако вышеописанное этого не делает, потому что «SA_PASSWORD», похоже, установлен в буквальную строку «$ {MY_DB_PASSWORD}». Как мне установить для двух моих переменных одно и то же значение без двойного жесткого кодирования строки «reallylongpassword»?

Комментарии:

1. привет. Вы решили свою проблему?

2. Привет, к сожалению, я все еще не знаю ответа здесь.

3. Я попробовал ваш .test_env в среде Linux и работает, как ожидалось: i.stack.imgur.com/7Glq4.png Вы в Windows?

4. Я на Mac. Но вы говорите, что в Linux «$ {MY_DB_PASSWORD}» не интерпретировался как буквальная строка «$ {MY_DB_PASSWORD}», а скорее обрабатывался как выражение?

5. ДА. В Linux работает!! И поскольку почти все приложения docker не предназначены для запуска на серверах Windows или Mac, вашей целью должно быть успешное выполнение в Linux.

Ответ №1:

Это невозможно с помощью файла env, просто сделайте в своем скрипте вот так. Этот способ более гибкий, поскольку он примет значение, если оно не задано.

 SA_PASSWORD="${SA_PASSWORD:-$MY_DB_PASSWORD}"
  

Если вы беспокоитесь о безопасности пароля, вам следует использовать docker secret, но вам нужно работать в режиме Swarm.

Вот файл dockerfile, используемый изображением. Вы можете определить свой собственный CMD, чтобы переопределить поведение и использовать свой env, или использовать хитрость, чтобы принять значение по умолчанию.

 CMD .start -sa_password $env:sa_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs "$env:attach_dbs" -Verbose

//using you MY_DB_PASSWORD instead of SA_PASSWORD
CMD .start -sa_password $env:my_db_password -ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs "$env:attach_dbs" -Verbose
  

Комментарии:

1. Изображение docker «mcr.microsoft.com/mssql/server:latest «требуется определить переменную «SA_PASSWORD», иначе она не сможет запуститься. Если я определю переменную «SA_PASSWORD» в скрипте, /my-app/my-script.sh изображение не сможет его прочитать.

2. SQLServer запускается с помощью CMD, вы можете определить свой CMD для переопределения поведения по умолчанию и запустить пользовательский скрипт для установки env перед запуском SQL server

3. Так что «CMD» — это последнее, что вы определяете в файле Dockerfile? Как вы определяете «my_db_password» ? Это также определено в Dockerfile?

4. Да, вы помещаете CMD последним в свой файл, тогда вы можете сохранить свой env_file, как и раньше, но вам нужна только одна переменная MY_DB_PASSWORD, поскольку командная строка больше не использует другую.