Вопрос или проблема
Я работаю над установкой GitLab CE в контейнере Docker с использованием Docker Compose. Моя операционная система – Ubuntu Server 24.04.
В рамках установки я определил переменную оболочки $GITLAB_HOME в своем .bash_profile. Однако, когда я запускаю docker-compose, GITLAB_HOME не определен. Что мне нужно сделать, чтобы это исправить? Вывод ниже.
dthacker@gitlab-docker:~/compose-lab$ echo $GITLAB_HOME
/srv/gitlab
dthacker@gitlab-docker:~/compose-lab$ sudo docker compose up -d
WARN[0000] Переменная "GITLAB_HOME" не установлена. Используется пустая строка по умолчанию.
WARN[0000] Переменная "GITLAB_HOME" не установлена. Используется пустая строка по умолчанию.
WARN[0000] Переменная "GITLAB_HOME" не установлена. Используется пустая строка по умолчанию.
и мой файл docker_compose.yml
image: gitlab/gitlab-ce:17.4.3-ce.0
container_name: gitlab
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
# Добавьте любую другую конфигурацию gitlab.rb здесь, каждая на своей строке
external_url 'https://gitlab.example.com'
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '256m'
Несмотря на то, что комментарии, похоже, решили проблему, я бы предостерег от использования неявно определенных переменных окружения для таких вещей.
Команда docker compose может принимать параметр --env-file
. Я бы предложил вам полагаться на это больше, чем модифицировать sudoers
или использовать аргумент --preserve-env
команды sudo
. Параметр --env-file
позволяет вам быть явным относительно переменных, на которые полагается ваша команда compose.
docker.env
GITLAB_HOME=/srv/gitlab
Тогда ваша команда была бы:
sudo docker compose --env-file ./docker.env up -d
Ответ или решение
Когда вы сталкиваетесь с проблемой, что переменная окружения, определенная в оболочке, не распознается Docker Compose, это может быть связано с несколькими факторами. В данном случае вы определили переменную $GITLAB_HOME в вашем .bash_profile, но она не доступна для команды docker-compose, когда вы используете sudo. Давайте рассмотрим, как это можно исправить, а также предложим более надежный способ работы с переменными окружения.
Проблема с доступностью переменных окружения
Переменные окружения, определенные в файле .bash_profile, доступны только для вашей пользовательской сессии оболочки. Однако, когда вы используете sudo
, вы запускаете новую оболочку с правами суперпользователя, и эта оболочка не видит переменные, определенные в вашей обычной оболочке. В большинстве случаев, это приводит к предупреждением, как вы видите в вашем выдаче:
WARN[0000] The "GITLAB_HOME" variable is not set. Defaulting to a blank string.
Решение проблемы
-
Проверка переменной окружения: Убедитесь, что переменная действительно определена, используя команду
echo $GITLAB_HOME
в оболочке. Если она возвращает правильный путь, значит, переменная определена. -
Запуск без sudo: Если возможно, попробуйте запустить Docker Compose без
sudo
. Это позволит вашей текущей сессии видеть все переменные окружения. -
Использование файла .env: Наиболее надежный способ передачи переменных окружения в Docker Compose — это использование файла
.env
. Создайте файл с именемdocker.env
в директории вашего проекта и добавьте в него необходимую переменную:GITLAB_HOME=/srv/gitlab
После этого замените команду запуска на:
sudo docker compose --env-file ./docker.env up -d
-
Передача переменной средством sudo: Если вам необходимо использовать
sudo
, вы можете передать переменные окружения непосредственно через команду. Например:sudo GITLAB_HOME=$GITLAB_HOME docker-compose up -d
Однако это может быть менее удобно, особенно если у вас много переменных.
Рекомендации
Поскольку использование переменных окружения непосредственно в командной строке может привести к путанице и ошибкам, рекомендуется использовать файлы .env для управления конфигурациями, которые может считывать Docker Compose.
В вашем docker-compose.yml
следует убедиться, что пути к томам указаны с использованием переменной таким образом:
volumes:
- '${GITLAB_HOME}/config:/etc/gitlab'
- '${GITLAB_HOME}/logs:/var/log/gitlab'
- '${GITLAB_HOME}/data:/var/opt/gitlab'
Использование фигурных скобок (${}
) помогает избежать возможных проблем с интерпретацией переменных оболочки, особенно когда у вас имеются специальные символы в путях.
Заключение
Следуя вышеизложенным шагам и рекомендациям, вы сможете эффективно использовать переменные окружения в Docker Compose, что сделает вашу конфигурацию более понятной и безопасной. Это также повысит стабильность вашего приложения, позволяя без проблем переносить его между различными средами.