Невозможно передать переменные окружения с опцией docker-compose run -e
Я пытаюсь получить переменную из командной строки, используя:
sudo docker-compose -f docker-compose-fooname.yml run -e BLABLA=hello someservicename
Мой файл выглядит так:
version: '3'
services:
someservicename:
environment:
- BLABLA
image: docker.websitename.com/image-name:latest
volumes:
- /var/www/image-name
command: ["npm", "run", BLABLA]
Все это для того, чтобы я мог запустить скрипт, определяемый тем, что я использую в качестве BLABLA, в командной строке, я попытался использовать официальную документацию.
Пробовал несколько вариантов, в том числе:
sudo COMPOSE_OPTIONS="-e BLABLA=hello" docker-compose -f docker-compose-fooname.yml run someservicename
ОБНОВЛЕНИЕ: я должен упомянуть, что, как это, я всегда получаю:
WARNING: The FAKE_SERVER_MODE variable is not set. Defaulting to a blank string.
Даже когда я просто запускаю следующую команду (будь то удаление, остановка..):
sudo docker-compose -f docker-compose-fooname.yml stop someservicename
Для справки: я сначала вытягиваю образ, я никогда его не собираю, но мой инструмент CI/CD делает (gitlab), это влияет на это?
Я использую docker-compose версии 1.18, docker версии 18.06.1-ce, Ubuntu 16.04
1 ответ
Тот docker-compose.yml
синтаксис работает не так, как вы ожидаете. Если вы напишите:
command: ["npm", "run", BLABLA]
Парсер YAML превратит это в список из трех строк npm
, run
, а также BLABLA
и когда Docker Compose увидит этот список, он попытается выполнить буквально эту команду без запуска оболочки для интерпретации чего-либо.
Если вы установите его в строку, Docker запустит над ним оболочку, и эта оболочка расширит переменную среды; пытаться
command: "npm run $BLABLA"
При этом, это немного странное использование Docker Compose. Как services:
ключ подразумевает, что более обычным вариантом использования является запуск некоторого набора долгосрочных служб с docker-compose up
; ты можешь npm run start
или, например, сервис, но у вас обычно не будет полностью параметризуемого блока без значения по умолчанию.
Я мог бы сделать docker-compose.yml
просто скажи
version: '3'
services:
someservicename:
image: docker.websitename.com/image-name:latest
command: ["npm", "run", "start"]
и если мне действительно нужно запустить что-то еще, запустите
docker-compose run --rm someservicename npm run somethingelse
(или просто используйте мой местный ./node_modules/.bin/somethingelse
и не задействовать докера вообще)