当前位置: 首页 > 知识库问答 >
问题:

Kubernetes在docker中使用env变量时警告冲突?为什么?

西门凯康
2023-03-14

我们正在将Gitlab用于CI/CD。我将包含我们正在使用gitlab ci cd文件的脚本

   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

根据脚本,我们只是合并了脚本,以避免在部署时在阶段和开发中遇到冲突/冲突。之前,我们为每个环境(stage和developer)提供了每个docker文件。现在我想合并dockerfile,我也合并了,但dockerfile没有抓取。库伯内特斯发生冲突(管道成功后显示警告)。我不知道如何清除库伯内特斯的警告。我将附上我合并的docker文件。

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"]

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

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 

当时,它运行良好,我没有面临库伯内特斯的任何问题。我只想添加环境变量来获取开发或阶段。你可以在docker构建后检查我的脚本。仅添加变量后,我们开始面临冲突。请帮我整理一下。提前谢谢。

Yaml文件

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

共有1个答案

督弘化
2023-03-14

据我所知,您希望使用docker文件中的变量在两种环境中运行从此docker文件构建的相同映像,我建议如下:

1-删除“ENV ENV\u var\u name=$environment\u name”,并直接在ENTRYPOIT中添加ENV\u var\u name(确保变量为大写),如下所示。

ENV PORT 8094
EXPOSE $PORT
ENTRYPOINT ["java","-Dspring.profiles.active= $ENV_VAR_NAME","-jar","/app/patient-service.jar"]

2-将此变量添加为患者服务中的环境变量。yml:

    ...
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:

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} - 
  ...
 类似资料:
  • 我在php项目中有一个Dockerfile,我需要在执行过程中传递用户和密码以下载库。 用户和密码必须在生产或本地 .env 文件中隐藏。目前我只是尝试本地选项,用户和密码为空。 我使用过和,但不仅登录失败,而且当我打印变量时,它们是空的。我也试过将变量硬编码,它工作正常,所以问题是变量没有从. env文件中检索。 docker compose开始如下 还有 Dockerfile: .env 的开

  • 问题内容: 我声明了以下方法: 客户端使用类似于 但是,上面显示的最后一行会生成警告 类型安全性:为varargs参数创建Map的通用数组 我不完全理解这一点,但是我想这是因为varargs参数被转换为数组,而拥有类型为泛型类的数组是一个坏主意(因为泛型是不变的,而数组不是)。 我可以通过将方法重新定义为 但这给将行对象放入客户端上的列表的负担,我宁愿避免。有更好的解决方案吗? 问题答案: 为了将

  • 问题内容: 作为python和docker的新手,我创建了一个小flask应用程序(test.py),该应用程序具有两个硬编码值: 我可以创建一个Docker映像并从以下Dockerfile运行一个容器: 如何在运行容器时为用户名和密码创建ENV变量并传递动态值? 问题答案: 在你的python代码中,你可以读取env变量,例如: 然后,当你运行容器时,可以设置以下变量: 这将在容器内设置env变

  • 问题内容: 我不知道如何从docker inspect中获取环境变量。 当我跑步 我得到以下 问题答案: 您可以直接使用类似于以下命令 对我来说 你会发现,更换的 像 给 实际上,我注意到以下内容,从更一般的显示到更精确的显示, 注意:有效且较短,当然,我发布了“旧”语法。

  • 问题内容: 我们正在开发一个Spring Boot Web应用程序,正在使用的数据库是MySql; 我们拥有的设置是我们首先在本地对其进行测试(意味着我们需要在PC上安装MySql); 然后我们推向Bitbucket ; Jenkins自动检测到对Bitbucket的新推送并在其上进行构建(要使Jenkins mvn构建通过,我们还需要在运行Jenkins的虚拟机上安装MySql)。 如果Jenk

  • 我们正在做一个spring boot web应用程序,我们使用的数据库是MySQL; > 我们的设置是首先在本地测试它(意味着我们需要在PC上安装MySQL); 然后我们推到Bitbucket; Jenkins自动检测对Bitbucket的新推送,并在其上进行构建(为了通过Jenkins mvn构建,我们还需要在运行Jenkins的虚拟机上安装MySQL)。 如果Jenkins构建通过,我们将代码