it-roy-ru.com

Как использовать переменные окружения в docker compose

Я хотел бы иметь возможность использовать переменные env внутри docker-compose.yml со значениями, передаваемыми во время docker-compose up . Это пример. Я делаю это сегодня с помощью базовой команды docker run, которая обернута вокруг моего собственного скрипта .. Есть ли способ добиться этого с помощью compose, без каких-либо таких оболочек bash?

proxy:
  hostname: $hostname
  volumes:
    - /mnt/data/logs/$hostname:/logs
    - /mnt/data/$hostname:/data
123
Dmitry z
  1. Создайте template.yml, который является вашим docker-compose.yml с переменной окружения.
  2. Предположим, что ваши переменные окружения находятся в файле 'env.sh'
  3. Поместите приведенный ниже фрагмент кода в файл sh и запустите его.

источник env.sh; rm -rf docker-compose.yml; envsubst <"template.yml"> "docker-compose.yml";

Будет создан новый файл docker-compose.yml с правильными значениями переменных среды.

Пример файла template.yml:

oracledb:
        image: ${Oracle_DB_IMAGE}
        privileged: true
        cpuset: "0"
        ports:
                - "${Oracle_DB_PORT}:${Oracle_DB_PORT}"
        command: /bin/sh -c "chmod 777 /tmp/start; /tmp/start"
        container_name: ${Oracle_DB_CONTAINER_NAME}

Пример файла env.sh:

#!/bin/bash 
export Oracle_DB_IMAGE=<image-name> 
export Oracle_DB_PORT=<port to be exposed> 
export Oracle_DB_CONTAINER_NAME=Oracle_DB_SERVER
68
Saurabh Kumar

Решение DOCKER:

Похоже, что docker-compose 1.5+ включил подстановку переменных: https://github.com/docker/compose/releases

Последняя версия Docker Compose позволяет получить доступ к переменным окружения из вашего файла compose. Таким образом, вы можете найти переменные окружения, а затем запустить Compose так:

set -a
source .my-env
docker-compose up -d

Затем вы можете ссылаться на переменные в docker-compose.yml, используя $ {VARIABLE}, например так:

db:
  image: "postgres:${POSTGRES_VERSION}"

А вот дополнительная информация из документов, взятых здесь: https://docs.docker.com/compose/compose-file/#variable-substitution

Когда вы запускаете docker-compose с этой конфигурацией, Compose выглядит для переменной среды POSTGRES_VERSION в командной консоли и подставляет его значение в. В этом примере Compose разрешает изображение для postgres: 9.3 перед запуском конфигурации.

Если переменная окружения не установлена, Compose заменяет пустой строки. В приведенном выше примере, если POSTGRES_VERSION не установлен, значение для опции изображения - postgres :.

Поддерживаются оба синтаксиса $ VARIABLE и $ {VARIABLE}. Extended Функции в стиле оболочки, такие как $ {VARIABLE-default} и $ {VARIABLE/foo/bar}, не поддерживаются.

Если вам нужно поместить буквенный знак доллара в значение конфигурации, используйте двойной знак доллара ($$).

И я полагаю, что эта функция была добавлена ​​в этот запрос на извлечение: https://github.com/docker/compose/pull/1765

Решение BASH:

Я заметил, что у людей есть проблемы с поддержкой переменных окружения Докера. Вместо того, чтобы иметь дело с переменными среды в Docker, давайте вернемся к основам, таким как bash! Вот более гибкий метод, использующий скрипт bash и файл .env.

Пример файла .env:

EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com 
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM

# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml

затем запустите скрипт bash в той же директории, которая должна правильно развернуть все:

#!/bin/bash

docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d

Просто укажите ваши переменные env в вашем файле compose с обычным синтаксисом bash (т.е. ${SECRET_KEY} для вставки SECRET_KEY из файла .env).

Обратите внимание, что COMPOSE_CONFIG определен в моем файле .env и используется в моем скрипте bash, но вы можете легко заменить {$COMPOSE_CONFIG} на my-compose-file.yml в скрипте bash.

Также обратите внимание, что я пометил это развертывание, назвав все свои контейнеры префиксом «myproject». Вы можете использовать любое имя, которое хотите, но оно помогает идентифицировать ваши контейнеры, чтобы вы могли легко ссылаться на них позже. Предполагая, что ваши контейнеры не имеют состояния, как и должно быть, этот сценарий быстро удалит и повторно развернет ваши контейнеры в соответствии с параметрами вашего файла .env и файлом составления YAML.

Update Поскольку этот ответ кажется довольно популярным, я написал сообщение в блоге, в котором более подробно описывается мой рабочий процесс развертывания Docker: http://lukeswart.net/2016/03/lets-deploy-part- 1/ Это может быть полезно, когда вы добавляете более сложную конфигурацию развертывания, такую ​​как конфиги nginx, сертификаты LetsEncrypt и связанные контейнеры.

182
modulitos

Кажется, что docker-compose теперь имеет встроенную поддержку переменных среды по умолчанию в файле .

все, что вам нужно сделать, это объявить ваши переменные в файле с именем .env, и они будут доступны в docker-compose.yml.

Например, для файла .env с содержимым:

MY_SECRET_KEY=SOME_SECRET
IMAGE_NAME=docker_image

Вы можете получить доступ к своей переменной внутри docker-compose.yml или переслать их в контейнер:

my-service:
  image: ${IMAGE_NAME}
  environment:
    MY_SECRET_KEY: ${MY_SECRET_KEY}
27
Doody P

При использовании переменных среды для томов вам необходимо:

  1. создать .env файл в той же папке, которая содержит файл docker-compose.yaml

  2. объявить переменную в файле .env:

    HOSTNAME=your_hostname
    
  3. Измените $hostname на ${HOSTNAME} в файле docker-compose.yaml

    proxy:
      hostname: ${HOSTNAME}
      volumes:
        - /mnt/data/logs/${HOSTNAME}:/logs
        - /mnt/data/${HOSTNAME}:/data
    

Конечно, вы можете сделать это динамически на каждой сборке, например:

echo "HOSTNAME=your_hostname" > .env && Sudo docker-compose up
14
Nerijus Gedrimas

Лучший способ - указать переменные окружения вне файла docker-compose.yml. Вы можете использовать настройку env_file и определить файл среды в той же строке. Затем повторное создание docker должно воссоздать контейнеры с новыми переменными среды.

Вот как выглядит мой docker-compose.yml:

services:
  web:
    env_file: variables.env

Заметка: docker-compose ожидает, что каждая строка в файле env будет в формате VAR=VAL. Избегайте использования export внутри файла .env. Кроме того, файл .env следует поместить в папку, в которой выполняется команда docker-compose.

7
Jibu James

Вы не можете ... пока. Но это альтернатива, подумайте как генератор docker-composer.yml:

https://Gist.github.com/Vad1mo/9ab63f28239515d4dafd

В основном сценарий Shell, который заменит ваши переменные. Также вы можете использовать задачу Grunt для создания файла компоновки Docker в конце процесса CI.

5
Thomas Decaux

У меня есть простой bash-скрипт, который я создал для этого, это просто означает, что нужно запустить его в вашем файле перед использованием: https://github.com/antonosmond/subber

По сути, просто создайте свой файл compose, используя двойные фигурные скобки для обозначения переменных среды, например:

app:
    build: "{{APP_PATH}}"
ports:
    - "{{APP_PORT_MAP}}"

Все, что находится в двойных фигурных скобках, будет заменено переменной среды с тем же именем, поэтому, если бы у меня были установлены следующие переменные среды:

APP_PATH=~/my_app/build
APP_PORT_MAP=5000:5000

при запуске subber docker-compose.yml полученный файл будет выглядеть так:

app:
    build: "~/my_app/build"
ports:
    - "5000:5000"
3
Anton

Следующее применимо для docker-compose 3.x Установка переменных среды внутри контейнера 

метод - 1 прямой метод

web:
  environment:
    - DEBUG=1
      POSTGRES_PASSWORD: 'postgres'
      POSTGRES_USER: 'postgres'

метод - 2 Файл «.env»

Создайте файл .env в том же месте, что и docker-compose.yml.

$ cat .env
TAG=v1.5
POSTGRES_PASSWORD: 'postgres'

и ваш составной файл будет как

$ cat docker-compose.yml
version: '3'
services:
  web:
    image: "webapp:${TAG}"
    postgres_password: "${POSTGRES_PASSWORD}"

источник

2
Gajendra D Ambi

Насколько я знаю, это незавершенное производство. Они хотят сделать это, но это еще не выпущено. См. 1377 ("новый" 495 который упоминается @Andy).

В итоге я реализовал подход «генерировать .yml как часть CI», предложенный @Thomas.

1
anroots

Используйте файл .env для определения динамических значений в docker-compse.yml. Будь то порт или любое другое значение.

Пример docker-compose:

testcore.web:
       image: xxxxxxxxxxxxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/testcore:latest
       volumes: 
            - c:/logs:c:/logs
       ports:
            - ${TEST_CORE_PORT}:80
       environment:
            - CONSUL_URL=http://${CONSUL_IP}:8500 
            - Host=${Host_ADDRESS}:${TEST_CORE_PORT}

Внутри .env файла вы можете определить значение этих переменных:

CONSUL_IP=172.31.28.151
Host_ADDRESS=172.31.16.221
TEST_CORE_PORT=10002
0
sorabzone

добавить env в файл .env

Такие как

VERSION=1.0.0

затем сохраните его в deploy.sh

INPUTFILE=docker-compose.yml
RESULT_NAME=docker-compose.product.yml
NAME=test

prepare() {
        local inFile=$(pwd)/$INPUTFILE
        local outFile=$(pwd)/$RESULT_NAME
        cp $inFile $outFile
        while read -r line; do
            OLD_IFS="$IFS"
            IFS="="
            pair=($line)
            IFS="$OLD_IFS"
               sed -i -e "s/\${${pair[0]}}/${pair[1]}/g" $outFile
            done <.env
     }

deploy() {
        docker stack deploy -c $outFile $NAME
}


prepare
deploy
0
foxundermon