Генерация параметров для `docker run` через расширение команды из файлов .env - PullRequest
0 голосов
/ 06 февраля 2020

У меня возникли проблемы с передачей некоторых параметров среды в docker run относительно общим образом c.

Нашей первой итерацией была загрузка файла .env в среду через эти строки :

set -o allexport;
. "${PROJECT_DIR}/.env";
set +o allexport;

А затем вручную введите --env VARNAME=$VARNAME в качестве параметров для команды docker run. Но это может быть довольно раздражающим, когда у вас есть десятки переменных.

Затем мы попытались просто передать файл с --env-file .env, и он , кажется, работает, но это не так потому что он плохо сочетается с кавычками вокруг значений переменных.

Здесь я начал делать сумасшедшие / уродливые вещи. Основная идея c заключалась в том, чтобы сделать что-то вроде:

set_docker_parameters()
{
    grep -v '^$' "${PROJECT_DIR}/.env" | while IFS= read -r LINE; do
        printf " -e %s" "${LINE}"
    done
}

docker run $(set_docker_parameters) --rm image:label command

Где анализируемые строки похожи на VARIABLE="value", VARIABLE='value' или VARIABLE=value. Пустые строки отбрасываются по каналу grep.

Но docker run постоянно жалуется на неправильный вызов. Когда я расширяю результат set_docker_parameters, я получаю то, что ожидал, и когда я копирую его результат и заменяю $(set_docker_parameters), тогда docker run работает, как и ожидалось, безупречно.

Любая идея о том, что я ' я делаю что-то не так?

Большое спасибо!

PS: Я пытаюсь сделать мой скрипт на 100% POSIX-совместимым, поэтому я предпочту любое решение, которое не зависит от Bash -specifi c функции.

1 Ответ

0 голосов
/ 07 февраля 2020

Основываясь на комментариях @jordanm, я разработал следующее решение:

docker_run_wrapper()
{
    # That's not ideal, but in any case it's not directly related to the question.
    cmd=$1

    set --; # Unset all positional arguments ($@ will be emptied)

    # We don't have arrays (we want to be POSIX compatible), so we'll
    # use $@ as a sort of substitute, appending new values to it.
    grep -v '^$' "${PROJECT_DIR}/.env" | while IFS= read -r LINE; do
        set -- "$@" "--env";
        set -- "$@" "${LINE}";
    done

    # We use $@ in a clearly non-standard way, just to expand the values
    # coming from the .env file.
    docker run "$@" "image:label" /bin/sh -c "${cmd}";
}

Опять же, это не код, который я написал для моего конкретного случая использования, а упрощение, которое показывает основы c идея. Если вы можете полагаться на Bash, то это может быть намного чище, не перегружая $@ и не используя массивы.

...