首页 > 解决方案 > 运行导出环境的 Makefile 有问题

问题描述

我创建了一个从固定路径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

我创建了一个 makefile 目标,如下所示

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)

更新2

如果我这样做

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

我在运行 makefile 时能够看到 nstgt1: ,但是如果现在我想从终端运行它,kubectl get ns我会收到相同的错误 `error: no configuration has been provided, 请尝试设置 KUBERNETES_MASTER 环境变量,我想从 makefile 配置它

标签: linuxshellkubernetesmakefilegnu-make

解决方案


问题是makefile recipe 创建了新的环境,在完成recipe 后被销毁。

如果你想在调用 make 后使用 kubernetes 工具,在你的场景中更合适的工具是使用source命令。它适用于您当前的环境中作为参数传递的脚本中所做的所有更改:

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

但是,如果您想在 make 脚本中使用 kubectl,请创建如下内容:

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

更新

我认为配置文件是一个脚本。所以你应该准备shell脚本设置环境,例如setupenv.sh

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

推荐阅读