Нужно ли мне делать больше, чем добавлять переменные env в файл docker-compose, чтобы использовать их в других контейнерах?раскручивать

#docker #docker-compose #docker-networking

#docker #docker-compose #docker-networking

Вопрос:

Я определяю URL для своего контейнера серверной службы в моем docker-compose.yaml.

 environment:
  PORT: 80
  VUE_APP_BACKEND_URL: "mm_backend:8080"
  

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

введите описание изображения здесь

Однако, когда я пытаюсь использовать свой внешний интерфейс для подключения к своему бэкэнду (извлечения данных), он сообщает мне, что VUE_APP_BACKEND_URL не определен на вкладке сеть.

Реализация и использование этой переменной окружения таковы в моем vue.js код

 getOwners(){
    fetch(`${process.env.VUE_APP_BACKEND_URL}/owners`, defaultOptions)
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        data.forEach((element) => {
          var entry = {
            value: element.id,
            text: `${element.display_name} (${element.name})`
          }
          this.owners.push(entry)
        })
      })
  

Приветствуется любая помощь.

Комментарии:

1. Действительно ли код выполняется в браузере? Он никогда не сможет увидеть переменные среды Docker или имена хостов.

2. Да, я запускаю в браузере. Так что, я думаю, мне просто нужно жестко закодировать свои URL-адреса в своих вызовах?

Ответ №1:

Это не сработает, потому что process.env.someKey недоступно в браузере. Другими словами, docker-compose не сильно поможет, если вы хотите передать любую переменную env в ваше интерфейсное приложение. Самый простой подход — определить backendUrl в самом коде в одном месте и использовать его для выполнения вызовов api. Если вам это не нравится, в StackOverflow уже есть несколько хороших ответов / решений для этой же проблемы.

Комментарии:

1. В итоге я поместил URL-адреса в сам код, и это, похоже, сработало! Спасибо.