Docker compose не подбирает переменную, которую я определил в своей оболочке.

Вопрос или проблема

Я работаю над установкой 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.

Решение проблемы

  1. Проверка переменной окружения: Убедитесь, что переменная действительно определена, используя команду echo $GITLAB_HOME в оболочке. Если она возвращает правильный путь, значит, переменная определена.

  2. Запуск без sudo: Если возможно, попробуйте запустить Docker Compose без sudo. Это позволит вашей текущей сессии видеть все переменные окружения.

  3. Использование файла .env: Наиболее надежный способ передачи переменных окружения в Docker Compose — это использование файла .env. Создайте файл с именем docker.env в директории вашего проекта и добавьте в него необходимую переменную:

    GITLAB_HOME=/srv/gitlab

    После этого замените команду запуска на:

    sudo docker compose --env-file ./docker.env up -d
  4. Передача переменной средством 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, что сделает вашу конфигурацию более понятной и безопасной. Это также повысит стабильность вашего приложения, позволяя без проблем переносить его между различными средами.

Оцените материал
Добавить комментарий

Капча загружается...