Переменные Dockerfile ENV не принимаются - PullRequest
1 голос
/ 25 февраля 2020

Я использую docker и dockerfile для создания образов. Я хочу создать образ PostgreSQL, поэтому я использую этот файл docker:

ARG POSTGRES_USER=vetouz
ARG POSTGRES_PASSWORD=***
ARG POSTGRES_DB=vetouz_mediatheque

FROM postgres:latest

USER postgres

EXPOSE 5432

Затем я запускаю образ с помощью этой команды

docker run -e POSTGRES_PASSWORD=vetouz -d --name postgres postgres:latest

Когда я выполняю эту роль vetouz, пароль и БД vetouz_mediatheque не созданы, и я не понимаю, почему. Я знаю это, потому что когда я получаю доступ к своему контейнеру с помощью sudo docker exec -it postgres bash и затем запускаю psql -U vetouz, я получаю ошибку role vetouz does not exist.

Это работает, если я запускаю свой образ с помощью следующей команды:

docker run -e POSTGRES_PASSWORD=*** -e POSTGRES_USER=vetouz -e POSTGRES_DB=vetouz_mediatheque -d --name postgres postgres:latest

Но я бы лучше определил мои переменные в файле docker.

Есть идеи, почему он не работает?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Пожалуйста, используйте ENV вместо ARG. Аргументы доступны только во время сборки, envs также доступны во время выполнения.

Источник

1 голос
/ 25 февраля 2020

ВАША ПРОБЛЕМА

Как уже говорилось, вы используете ARG, который доступен только при построении изображения Docker, но использование переменных env для установки конфиденциальной информации в изображении Docker не безопасный подход, и я объясню, почему.

ОБЕСПЕЧЕНИЯ БЕЗОПАСНОСТИ

Но я бы лучше определил мои переменные в файле Docker.

Это нормально для информации, которая не является конфиденциальной, но не рекомендуется для конфиденциальной информации, такой как пароли, потому что учетные данные базы данных будут храниться в виде простого текста в Dockerfile, и даже если вы используете ARG для установки ENV var, они будут доступно в слоях docker.

docker run -e POSTGRES_PASSWORD = *** -e POSTGRES_USER = vetouz -e POSTGRES_DB = vetouz_mediatheque -d --name postgres postgres : latest

Это также плохая практика с точки зрения безопасности, поскольку теперь учетные данные вашей базы данных сохраняются в истории bash.

На машине Linux вы можете проверить k с:

history | grep -i POSTGRES

БОЛЬШЕ БЕЗОПАСНОГО ПОДХОДА

Создайте файл .env:
POSTGRES_USER=vetouz
POSTGRES_PASSWORD=your-password-here
POSTGRES_DB=vetouz_mediatheque

Не забудьте добавить файл .env в .gitignore:

echo ".env" >> .gitignore

Запуск контейнера Docker

Теперь запустите контейнер docker с:

docker run --env-file ./.env -d --name postgres postgres:latest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...