首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库伯内特斯在码头使用env变量时警告冲突?为什么?

库伯内特斯在码头使用env变量时警告冲突?为什么?
EN

Stack Overflow用户
提问于 2022-05-23 05:34:37
回答 1查看 140关注 0票数 0

我们用Gitlab做CI/CD。我将包括我们使用的gitlab cd文件的脚本

代码语言:javascript
复制
   services:
  - docker:19.03.11-dind
before_script:
  - apk update && apk add bash
  - apk update && apk add gettext  
workflow:
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "developer" || $CI_COMMIT_BRANCH == "stage"|| ($CI_COMMIT_BRANCH =~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i))
      when: always
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH != "developer" || $CI_COMMIT_BRANCH != "stage"|| ($CI_COMMIT_BRANCH !~ (/^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i))
      when: never 
stages:
  - build
  - Publish
  - deploy
cache:
  paths:
    - .m2/repository
    - target

build_jar:
  image: maven:3.8.3-jdk-11
  stage: build
  script: 
    - mvn clean install package -DskipTests=true
  artifacts:
    paths:
      - target/*.jar

docker_build_dev:
  stage: Publish
  image: docker:19.03.11
  services:
    - docker:19.03.11-dind      
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script: 
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG
  only:
    - /^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i
    - developer

docker_build_stage:
  stage: Publish
  image: docker:19.03.11
  services:
    - docker:19.03.11-dind   
  variables:
    IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  script: 
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG   
  only:
    - stage

deploy_dev:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  variables:
    ENV_VAR_NAME: development
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" patient-service.yml     
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_DEV $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - cat patient-service.yml | envsubst | kubectl apply -f patient-service.yml -n ${KUBE_NAMESPACE_DEV}
  only:
    - /^([A-Z]([0-9][-_])?)?SPRINT(([-_][A-Z][0-9])?)+/i
    - developer

deploy_stage:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  variables:
    ENV_VAR_NAME: stage
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" patient-service.yml    
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_STAGE $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - cat patient-service.yml | envsubst | kubectl apply -f patient-service.yml -n ${KUBE_NAMESPACE_STAGE}
  only:
    - stage

根据该脚本,我们只是将脚本合并,以避免在部署时因阶段和开发而面临冲突/冲突。在此之前,我们为每个环境(阶段和开发人员)提供了每个坞文件。现在我也想合并dockerfile,我合并了,但是dockerfile没有获取。在库伯内特斯发生冲突(管道成功后警告显示)。我不知道如何清除库伯内特斯的警告。我会附上我合并的码头文件。

代码语言:javascript
复制
FROM maven:3.8.3-jdk-11 AS MAVEN_BUILD
COPY pom.xml /build/
COPY src /build/src/
WORKDIR /build/
RUN mvn clean install package -DskipTests=true
FROM openjdk:11
ARG environment_name 
WORKDIR /app
COPY --from=MAVEN_BUILD /build/target/patient-service-*.jar /app/patient-service.jar
ENV PORT 8094
ENV env_var_name=$environment_name
EXPOSE $PORT
ENTRYPOINT ["java","-Dspring.profiles.active= $env_var_name","-jar","/app/patient-service.jar"]

我们之前用过的最后一行,

代码语言:javascript
复制
ENTRYPOINT ["java","-Dspring.profiles.active=development","-jar","/app/patient-service.jar"] -for developer dockerfile
ENTRYPOINT ["java","-Dspring.profiles.active=stage","-jar","/app/patient-service.jar"] - for stage dockerfile 

在那个时候,它的工作很好,我没有面对任何关于库伯内特斯的问题。我只需要添加环境变量来获取,无论是开发还是阶段。你可以检查一下,我的剧本在码头建好后。在只增加变量后,我们开始面临冲突。请帮我解决这个问题。提前谢谢。

Yaml文件

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: patient-app
  labels:
    app: patient-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app : patient-app
  template:
    metadata:
      labels:
        app: patient-app
    spec:
      containers:
      - name: patient-app
        image: registry.gitlab.com/stella-center/backend-services/patient-service:<VERSION>
        imagePullPolicy: Always
        ports:
          - containerPort: 8094
      imagePullSecrets:
        - name:  gitlab-registry-token-auth

---

apiVersion: v1
kind: Service
metadata:
  name:  patient-service
spec:
  type: NodePort
  selector:
    app:  patient-app
  ports:
  - port:  8094
    targetPort:  8094
EN

回答 1

Stack Overflow用户

发布于 2022-05-23 11:55:18

正如我所理解的那样,您希望在两个环境中使用docker文件中的变量运行从这个docker文件生成的相同映像,我建议如下:

1-删除"ENV env_var_name=$environment_name“并将ENV_VAR_NAME直接添加到ENTRYPOIT中(确保变量为大写),如下所示。

代码语言:javascript
复制
ENV PORT 8094
EXPOSE $PORT
ENTRYPOINT ["java","-Dspring.profiles.active= $ENV_VAR_NAME","-jar","/app/patient-service.jar"]

2-将此变量添加为病人服务中的环境变量。

代码语言:javascript
复制
    ...
apiVersion: apps/v1
kind: Deployment
metadata:
  name: patient-app
  labels:
    app: patient-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app : patient-app
  template:
    metadata:
      labels:
        app: patient-app
    spec:
      containers:
      - name: patient-app
        image: registry.gitlab.com/stella-center/backend-services/patient-service:<VERSION>
        imagePullPolicy: Always
        ports:
          - containerPort: 8094
        env:
        - name: ENV_VAR_NAME
          value: "${ENV_VAR_NAME}"
      imagePullSecrets:
        - name:  gitlab-registry-token-auth

3-在GitLab ci yml文件中指定变量及其值,并在部署命令中使用envsubst

代码语言:javascript
复制
deploy_dev:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  variables:
    ENV_VAR_NAME: development
  before_script:
    - apk update && apk add gettext
  ..
  script:
  ..
    - cat patient-service.yml | envsubst | kubectl apply -f -n ${KUBE_NAMESPACE_STAGE} - 
  ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72343649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档