Я новичок в Docker, и неясно, как получить доступ к внешней базе данных из контейнера. Является ли лучший способ жесткого кода в строке подключения?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
Я новичок в Docker, и неясно, как получить доступ к внешней базе данных из контейнера. Является ли лучший способ жесткого кода в строке подключения?
# Dockerfile
ENV DATABASE_URL amazon:rds/connection?string
Вы можете передавать переменные окружения в ваши контейнеры с -e
флагом.
Пример из скрипта запуска:
sudo docker run -d -t -i -e REDIS_NAMESPACE='staging' \
-e POSTGRES_ENV_POSTGRES_PASSWORD='foo' \
-e POSTGRES_ENV_POSTGRES_USER='bar' \
-e POSTGRES_ENV_DB_NAME='mysite_staging' \
-e POSTGRES_PORT_5432_TCP_ADDR='docker-db-1.hidden.us-east-1.rds.amazonaws.com' \
-e SITE_URL='staging.mysite.com' \
-p 80:80 \
--link redis:redis \
--name container_name dockerhub_id/image_name
Или, если вы не хотите иметь значение в командной строке, где оно будет отображаться и ps
т. Д., -e
Можете получить значение из текущей среды, если вы просто передадите его без =
:
sudo PASSWORD='foo' docker run [...] -e PASSWORD [...]
Если у вас много переменных окружения и особенно если они предназначены для секретности, вы можете использовать env-файл :
$ docker run --env-file ./env.list ubuntu bash
Флаг --env-file принимает имя файла в качестве аргумента и ожидает, что каждая строка будет в формате VAR = VAL, имитируя аргумент, передаваемый --env. Строки комментариев должны быть только с префиксом #
export PASSWORD=foo
вместо этого, и переменная будет переданаdocker run
как переменная окружения, заставляяdocker run -e PASSWORD
работать.Вы можете передать используя
-e
параметры сdocker run ..
командой, как упомянуто здесь и как упомянуто @errata.Однако возможный недостаток этого подхода заключается в том, что ваши учетные данные будут отображаться в списке процессов, где вы его запускаете.
Для того, чтобы сделать его более безопасным, вы можете написать свои учетные данные в файле конфигурации и делать
docker run
с ,--env-file
как указано здесь . Затем вы можете контролировать доступ к этому файлу конфигурации, чтобы другие, имеющие доступ к этому компьютеру, не увидели ваши учетные данные.источник
--env-file
, когда вы используете--env
ваши значения env, они будут заключены в кавычки / экранированы со стандартной семантикой любой используемой вами оболочки, но при использовании--env-file
значений, которые вы получите внутри вашего контейнера, все будет иначе. Команда docker run просто читает файл, выполняет базовый анализ и передает значения в контейнер, это не эквивалентно поведению вашей оболочки. Просто небольшая ошибка, которую нужно знать, если вы конвертируете кучу--env
записей в--env-file
.Если вы используете 'docker-compose' в качестве метода ускорения ваших контейнеров, на самом деле есть полезный способ передать переменную среды, определенную на вашем сервере, в контейнер Docker.
docker-compose.yml
Допустим, в вашем файле вы раскручиваете базовый контейнер hapi-js, а код выглядит так:Предположим, что на локальном сервере, на котором находится ваш проект Docker, есть переменная среды с именем 'NODE_DB_CONNECT', которую вы хотите передать в свой контейнер hapi-js, и вы хотите, чтобы его новое имя было 'HAPI_DB_CONNECT'. Затем в
docker-compose.yml
файле вы передадите локальную переменную среды в контейнер и переименуете ее так:Я надеюсь, что это поможет вам избежать жесткого кодирования строки подключения к базе данных в любом файле вашего контейнера!
источник
Используя
docker-compose
, вы можете наследовать переменные env в docker-compose.yml и впоследствии любые Dockerfile (ы), вызываемыеdocker-compose
для создания образов. Это полезно, когдаDockerfile
RUN
команда должна выполнять команды, специфичные для среды.(ваша оболочка
RAILS_ENV=development
уже существует в среде)docker-compose.yml :
Dockerfile :
Таким образом , я не нужно указывать переменные окружения в файлах или
docker-compose
build
/up
команд:источник
Используйте
-e
значение или --env для установки переменных среды (по умолчанию []).Пример из скрипта запуска:
Если вы хотите использовать несколько сред из командной строки, то перед каждой переменной среды используйте
-e
флаг.Пример:
Если вам нужно установить много переменных, используйте
--env-file
флагНапример,
Для любой другой помощи, посмотрите в справку Docker:
Официальная документация: https://docs.docker.com/compose/environment-variables/
источник
ubuntu bash
? Это относится к изображениям, созданным с Ubuntu в качестве базового изображения, или к каждому изображению?-e
аргументов давным-давно! Я даже не могу понять, почему они сделали это необходимым ...Есть хороший способ, как передать переменные окружения хост-машины в докер-контейнер:
источник
Для Amazon AWS ECS / ECR вы должны управлять переменными среды ( особенно секретами ) с помощью частного сегмента S3. См. Сообщение в блоге « Как управлять секретами для приложений на основе сервисов контейнеров Amazon EC2 с помощью Amazon S3 и Docker» .
источник
Другой способ заключается в использовании полномочий
/usr/bin/env
:источник
Если у вас есть переменные окружения
env.sh
локально и вы хотите установить их при запуске контейнера, вы можете попробоватьЭта команда запускает контейнер с оболочкой bash (я хочу оболочку bash, поскольку
source
это команда bash), получает исходныйenv.sh
файл (который устанавливает переменные окружения) и выполняет файл jar.На
env.sh
внешнем виде , как это,Я добавил
printenv
команду только для проверки того, что фактическая команда источника работает. Вы, вероятно, должны удалить его, когда подтвердите, что команда источника работает нормально, или переменные окружения появятся в ваших журналах докера.источник
--env-file
arg дляdocker run
команды. Например, если вы развертываете приложение с использованием механизма приложений Google, а приложению, работающему внутри контейнера, требуются переменные среды, установленные внутри контейнера Docker, у вас нет прямого подхода для установки переменных среды, поскольку вы не можете контролироватьdocker run
команду , В таком случае у вас может быть сценарий, который расшифровывает переменные env с помощью, скажем, KMS и добавляет их к тому,env.sh
который можно получить для установки переменных env..
(точка), доступную в обычном,sh
вместоsource
. (такsource
же, как.
)Используя jq для конвертации env в JSON:
это требует JQ версии 1.6 или новее
это pust хост env как json, по сути, так в Dockerfile:
источник
docker run -e HOST_ENV="$env_as_json" <image>
? : ? В моем случае Docker, по-видимому, не разрешает переменные или подоболочки (${}
или$()
) при передаче в качестве аргументов docker. Например:A=123 docker run --rm -it -e HE="$A" ubuntu
затем внутри этого контейнера:root@947c89c79397:/# echo $HE root@947c89c79397:/#
....HE
Переменная не делает это.мы также можем разместить переменную окружения компьютера, используя флаг -e и $:
Перед запуском нужно экспортировать (значит установить) локальную переменную env и файл или просто перед использованием
Используя этот метод, установите переменную env автоматически с вашим именем в моем случае (MG_HOST, MG_USER)
Дополнительно:
Если вы используете python, вы можете получить доступ к этим переменным envment в Docker с помощью
источник
docker run --rm -it --env-file <(bash -c 'env | grep <your env data>')
Это способ получить данные, хранящиеся в a,.env
и передать их в Docker, при этом ничего не хранится небезопасно (так что вы не можете просто смотретьdocker history
и брать ключи).Скажем, у вас есть куча вещей от AWS,
.env
вот так:запуск docker с `` `docker run --rm -it --env-file <(bash -c 'env | grep AWS_') соберет все это и безопасно передаст, чтобы получить доступ из контейнера.
источник