Файл Env неправильно получен из сценария точки входа - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь получить файл .env из условного скрипта entrypoint.sh, который частично выглядит так:

if [ -f "some-env-file.env" ]; then
source some-env-file.env

простой вывод переменной окружения, найденной внутриФайл .env, сразу после указанной выше исходной команды, выводит правильное значение, и операции, указанные после в сценарии точки входа, выполняются успешно.

Однако, когда я выполняю docker exec -it внутри экземпляра контейнера, envПохоже, файл не получен.Только когда я получаю его снова оттуда, я получаю желаемые результаты.(В частности, файл env используется для указания на конкретную среду выполнения для python. Поэтому после входа в контейнер python вызывается правильно только при повторном получении файла env).

Что я делаю неправильно?

Для справки, это последние строки моего Dockerfile (ничего особенного в этом нет):

COPY ./entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]

Создание экземпляра контейнера выполняется с помощью docker-compose yaml.

Заранее спасибо и извините, если об этом уже спрашивали.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Добавление этого к моему entrypoint.sh исправило проблему:

cat >> /etc/bash.bashrc <<EOF
if [ -f some-env-file.env ]; then
  source some-env-file.env
fi
EOF
0 голосов
/ 23 сентября 2018

Процесс запуска Docker заключается в том, что Docker устанавливает некоторые переменные среды (из параметров Dockerfile и docker run -e), а затем запускает точку входа контейнера.Все, что происходит в точке входа, не входит в компетенцию Докера.В частности, отладочная оболочка, которая запускается через docker exec, не является дочерней по отношению к точке входа и не будет наследовать переменные среды, которые там установлены.(NB: я нигде не могу найти это явно в документации Docker.)

Один хороший эксперимент, который стоит попробовать - это запустить:

% docker run -d --name test busybox sh -c 'sleep 60; sleep 60'
6c6aada7e5299e816e9d12dfab9845cc396485a46d909255375128b87ee5eedf
% docker exec test ps -o pid,ppid,comm
PID   PPID  COMMAND
    1     0 sh
    6     1 sleep
    7     0 ps

Корневой процесс контейнера - это оболочка, которая получаетидентификатор процесса 1, и он запускает подпроцесс sleep с идентификатором процесса 6 и идентификатором родительского процесса 1. Команда docker exec ps получает новый идентификатор процесса, но имеет искусственный идентификатор родительского процесса, равный 0 - это непотомок корневого процесса контейнера.

Если вы хотите отладить среду запуска вашего образа, с типичным сценарием точки входа, таким как

#!/bin/sh
. /env.sh
exec "$@"

, вы можете docker run --rm -it myimage sh, и полученная оболочка получитзапускается через скрипт входа.Но, как вы заметили, попытка отладки через docker exec не проходит ни через одну часть последовательности точек входа.

...