#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, поскольку командная строка больше не использует другую.