Makefile запускает экспорт env с проблемой - PullRequest
1 голос
/ 04 мая 2020

Я создал Makefile для экспорта kubeconfig из фиксированный путь, например:

myproj
 - .kube     //folder
     config    //file which contain the config
 - Makefile.  //same level as .kube folder

Теперь, когда я запускаю из терминала следующее работает, я имею в виду, если я запускаю kubectl get ns Я получил результаты, что означает, что он настроил успешно !

export KUBECONFIG=/Users/i33333/projects/app-test/v-app/.kube/config

Я создал цель make-файла, как показано ниже

kube-cfg:
    export KUBECONFIG=$(PWD)/.kube/config

При выполнении цели я вижу в терминале

export KUBECONFIG=/Users/i33333/projects/app-test/v-app/.kube/config

, что точно так же , что и при ручном выполнении, но когда я запускаю kubectl get ns

Я получил ошибку:

error: no configuration has been provided, try setting KUBERNETES_MASTER environment variable

Я не понимаю, почему не работает, когда я запускаю его из makefile , и работает, когда я запускаю его из терминала вручную? Любая идея, я пытаюсь изменить и использовать также $ (CURRDIR), который не помогает

обновление

Я пытался, как предложил, который не работает

KUBECONFIG=$(PWD)/.kube/config


kube-cfg:
    export $(KUBECONFIG)

update2

Если я сделаю это так

KUBECONFIG := $(PWD)/kube/config.yaml
tgt1:
    @export KUBECONFIG=$(KUBECONFIG) && kubectl get ns

Я смог увидеть ns при запуске make-файла tgt1: но если теперь я хочу запустить его из терминала kubectl get ns Я получаю ту же ошибку `ошибка: конфигурация не предоставлена, попробуйте установить переменную среды KUBERNETES_MASTER, Я хочу настроить ее из файла makefile

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Когда вы запускаете make, рецепт выполняется в оболочке, которая разветвляется из процесса make. Кроме того, рецепты, охватывающие несколько строк, для каждой строки (если она не связана с escape-символом новой строки), также получают собственный дочерний процесс оболочки. Это фактически означает, что то, что происходит (присваивание или экспорт переменных оболочки) в любой из этих оболочек, не влияет на саму make или другие строки рецепта.

Вы можете определить, например, переменную make (как вы в обновлении), а затем вы можете установить это в среде для любой команды (somecmd), которую вы пытаетесь выполнить, например:

some_target:
    export KUBECONFIG=$(KUBECONFIG); somecmd

или:

some_target:
    KUBECONFIG=$(KUBECONFIG) somecmd

В этом случае KUBECONFIG ссылается на переменную make, подобную той, которую вы определили выше:

KUBECONFIG := $(PWD)/.kube/config

То есть так:

KUBECONFIG := $(PWD)/.kube/config

all: tgt1 tgt2

tgt1:
        @export KUBECONFIG=$(KUBECONFIG); echo "KUBECONFIG is $${KUBECONFIG}"

tgt2:
        @KUBECONFIG=$(KUBECONFIG) sh -c 'echo KUBECONFIG is $${KUBECONFIG}'

Выход:

$ make
KUBECONFIG is /tmp/.kube/config
KUBECONFIG is /tmp/.kube/config

Итак, если вы ищете что-то, что сохраняется и после выполнения make, вам нужно записать это. Например, обертка, такая как:

KUBECONFIG := $(PWD)/kube/config.yaml

.PHONY: call

# run callme.sh being the first prerequisite.
call: callme.sh
    ./$<

# creates and sets exec bit on rule target here being callme.sh
callme.sh:
    @echo -e '#!/bin/bash\nKUBECONFIG=$(KUBECONFIG) kubectl get ns' > $@
    chmod +x $@

Это позволяет запускать make, а цель call вызывает обертку ... и у вас также есть обертка callme.sh, которую вы можете запустить после make.

1 голос
/ 04 мая 2020

Проблема в том, что рецепт makefile создает новую среду, которая уничтожается после завершения рецепта.

Если вы хотите использовать инструменты kubernetes после вызова make, более подходящим инструментом в вашем сценарии является использование команды source. Он применяет в вашей текущей среде все изменения, сделанные в сценарии, переданные в качестве параметра:

$ source setupenv.sh
$ kubectl get ns # should be no problem
$ make someting # even using kubectl inside make shouldn't be a problem

Однако, если вы хотите использовать kubectl в сценариях make, создайте что-то вроде:

recipe :
      source setupenv.sh && kubectl get ns
# or 
recipe2 :
      export KUBECONFIG=$(PWD)/.kube/config && kubectl get ns

ОБНОВЛЕНИЕ :

Я думал, что файл конфигурации - это скрипт. Поэтому вам следует подготовить сценарий настройки оболочки, например setupenv.sh:

#!/bin/bash
export KUBECONFIG=$(PWD)/.kube/config
...