Невозможно передать переменные окружения с опцией 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 и не задействовать докера вообще)

Другие вопросы по тегам