Короче говоря,
- используйте
ENV
для установки переменных окружения в изображение. - или
source
ваш файл env на docker run
Вот ваш Dockerfile:
FROM bitnami/minideb:latest
RUN . /etc/os-release
RUN echo "code1=${VERSION_CODENAME}"
RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}"
Согласно вашему Dockerfile, движок docker интерпретирует инструкции следующим образом:
RUN . /etc/os-release
: запускает промежуточный контейнер из образа bitnami/minideb:latest
и source
файл /etc/os-release
, затем фиксирует этот контейнер в изображении с идентификатором ( скажем ab12
) RUN echo "code1=${VERSION_CODENAME}"
: запускает другой промежуточный контейнер из образа ab12
, который был зафиксирован на предыдущем шаге. docker двигатель запускает echo "code1=${VERSION_CODENAME}"
в этом контейнере, затем фиксирует его в другом образе cd34
- , как 2., но
source
и echo
выполняются в том же промежуточном контейнере.
Очевидно, что на шаге 1 и 2 команды source
и echo
выполняются в разных контейнерах, поэтому вам не удалось получить нужные переменные.
Итак, ENV
инструкция является рекомендуемым способом решения вашей проблемы. Но если вам действительно нужно прочитать envs из файла, вот обходной путь.
- подготовьте файл с именем
my-env.sh
:
#!/bin/bash
export ENV1=XXX
export ENV2=XXX
# ...
подготовить файл с именем
entrypoint.sh
:
#!/bin/bash
. /my-env.sh
# rest of the things you wanna do when start this image into a container
подготовить файл Docker:
FROM bitnami/minideb:latest
# copy files from local to image
COPY my-env.sh /my-env.sh
COPY entrypoint.sh /entrypoint.sh
# when start this image into a container, execute the following command
ENTRYPOINT ["bash", "/entrypoint.sh"]
построить изображение по
docker build -t <repo:tag> .
. Перед созданием образа ваш текущий рабочий каталог должен содержать:
- my-env. sh
- точка входа. sh
- Dockerfile
Удачи!