Azure 将env变量注入映像的构建阶段

Azure 将env变量注入映像的构建阶段,azure,docker,azure-devops,dockerfile,azure-pipelines,Azure,Docker,Azure Devops,Dockerfile,Azure Pipelines,为基于Django的API开发CI/CD管道。我需要在构建阶段注入环境变量以成功构建映像 生成映像时,python manage.py collectstatic在Dockerfile中运行 collectstatic需要运行settings.py中的SECRET\u密钥 SECRET\u KEY在此阶段为空,因为它是通过os.environ['SECRET\u KEY] 因为它是空的,所以构建失败 因此,我需要将环境设置为具有此变量 我很难把这么多东西放在一起,所以我想看看是否有人能帮助我

为基于Django的API开发CI/CD管道。我需要在构建阶段注入环境变量以成功构建映像

  • 生成映像时,
    python manage.py collectstatic
    Dockerfile
    中运行
  • collectstatic
    需要运行
    settings.py
    中的
    SECRET\u密钥
  • SECRET\u KEY
    在此阶段为空,因为它是通过
    os.environ['SECRET\u KEY]
  • 因为它是空的,所以构建失败
  • 因此,我需要将环境设置为具有此变量
我很难把这么多东西放在一起,所以我想看看是否有人能帮助我

这就是我到目前为止所做的:

Azure管道

FROM python:3.7-slim
ENV PYTHONUNBUFFERED 1
WORKDIR /app
EXPOSE 5000
COPY requirements*.txt ./
RUN pip install -r requirements.txt
COPY . .
RUN python manage.py collectstatic
CMD ["gunicorn", "-b", ":5000", "--log-level", "info", "config.wsgi:application"]

azure pipelines.yml

trigger:
  branches:
    include:
    - master

resources:
- repo: self

variables:
  # Container registry service connection established during pipeline creation
  secretKey: $(SECRET_KEY)

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - bash:
      env:
        SECRET_KEY: $(secretKey)
    - task: Docker@2
      displayName: Build and push api image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)-api
        dockerfile: $(dockerfilePath)/api/Dockerfile
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
    - upload: manifests
      artifact: manifests
Dockerfile

FROM python:3.7-slim
ENV PYTHONUNBUFFERED 1
WORKDIR /app
EXPOSE 5000
COPY requirements*.txt ./
RUN pip install -r requirements.txt
COPY . .
RUN python manage.py collectstatic
CMD ["gunicorn", "-b", ":5000", "--log-level", "info", "config.wsgi:application"]
生成失败日志(可能没有帮助,因为我知道它失败的原因…
密钥
不在环境变量中)

步骤8/18:运行python manage.py collectstatic
--->在1f42a5c062aa中运行
回溯(最近一次呼叫最后一次):
文件“manage.py”,第21行,在
main()
文件“manage.py”,第17行,主
从命令行(sys.argv)执行命令
文件“/usr/local/lib/python3.7/site packages/django/core/management/__init__.py”,第381行,从命令行执行
utility.execute()
文件“/usr/local/lib/python3.7/site packages/django/core/management/__init__.py”,执行中的第325行
settings.INSTALLED\u应用程序
文件“/usr/local/lib/python3.7/site packages/django/conf/_init__.py”,第79行,在_getattr中__
自我设置(名称)
文件“/usr/local/lib/python3.7/site packages/django/conf/_init__.py”,第66行,在安装程序中
自包装=设置(设置模块)
文件“/usr/local/lib/python3.7/site packages/django/conf/_init__.py”,第157行,在_init中__
mod=importlib.import\u模块(自我设置\u模块)
文件“/usr/local/lib/python3.7/importlib/_init__uuu.py”,第127行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第1006行,在\u gcd\u导入中
文件“”,第983行,在_find_和_load中
文件“”,第967行,在“查找”和“加载”中解锁
文件“”,第677行,在\u加载\u解锁
exec_模块中第728行的文件“”
文件“”,第219行,在“调用”中,删除了“帧”
文件“/app/config/settings.py”,第26行,在
SECRET\u KEY=os.environ['SECRET\u KEY']
文件“/usr/local/lib/python3.7/os.py”,第679行,在__
从“无”提升钥匙错误(钥匙)
KeyError:“机密密钥”
命令“/bin/sh-c python manage.py collectstatic”返回一个非零代码:1
##[错误]命令“/bin/sh-c python manage.py collectstatic”返回了一个非零代码:1
##[错误]进程“/usr/bin/docker”失败,退出代码为1
我只是不知道如何在那里实现环境变量。我的方法从一开始就可能是完全错误的

那么,我应该如何着手:

  • 安全地声明管道中的环境变量
  • 将所述环境变量传递到构建阶段

  • 谢谢

    您可以使用
    Dockerfile
    中的
    --build arg
    和相应的
    arg
    命令注入环境变量,但这并不安全。钥匙将嵌入图像中

    如果希望安全,请选择以下选项:

  • 使用Docker build之外的密钥下载您需要的任何东西,并将其复制到中
  • 使用Docker的BuildKit后端(实验性的,但比过去更少的bug),它支持安全地传递机密
  • 在另一个容器中运行网络服务器,使用
    --networkcontainer:
    运行Docker构建,现在您可以向另一个容器发送查询以获取机密。或者类似地在主机上运行webserver,执行
    --网络主机

  • 更长的writeup,它还提到了其他一些替代方法,比如通过多阶段构建进行复制:

    您的
    python manage.py collectstatic
    正在docker容器中运行,它的
    os.environ['SECRET\u KEY]
    将尝试获取它运行的容器的环境变量。但是您在管道中设置的环境变量SECRET_KEY是用于构建代理的

    您可以尝试以下步骤将管道环境变量传递给docker容器

    1,我在dockerfile
    ARG SECRET中添加了一个
    ARG
    和一个
    ENV
    ;环境机密\u密钥$SECRET

    FROM python:3.7-slim
    
    ARG SECRET
    ENV SECRET_KEY $SECRET
    
    ENV PYTHONUNBUFFERED 1
    WORKDIR /app
    EXPOSE 5000
    COPY requirements*.txt ./
    RUN pip install -r requirements.txt
    COPY . .
    RUN python manage.py collectstatic
    CMD ["gunicorn", "-b", ":5000", "--log-level", "info", "config.wsgi:application"]
    
    ENV SECRET\u KEY
    指的是
    ARG SECRET

    FROM python:3.7-slim
    
    ARG SECRET
    ENV SECRET_KEY $SECRET
    
    ENV PYTHONUNBUFFERED 1
    WORKDIR /app
    EXPOSE 5000
    COPY requirements*.txt ./
    RUN pip install -r requirements.txt
    COPY . .
    RUN python manage.py collectstatic
    CMD ["gunicorn", "-b", ":5000", "--log-level", "info", "config.wsgi:application"]
    
    2,我将docker buildandpush任务分离为dock build和dock push,因为buildandpush命令不能接受参数

    在docker构建任务中。我将变量
    secretKey
    传递给参数字段
    --build arg SECRET=$(secretKey)
    。因此,当docker运行build时,
    ARG SECRET
    将被
    secretKey
    替换。它将被传递到上述dockerfile中定义的
    ENV SECRET\u密钥
    。因此,SECRET_KEY将被设置为docker容器的环境变量

    然后,python代码应该能够使用
    os.environ['SECRET\u KEY]

    stages:
    - stage: Build
      displayName: Build and push stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: $(vmImageName)
        steps:
        - task: Docker@2
          displayName: Build
          inputs:
            command: build
            repository: $(imageRepository)-api
            dockerfile: $(dockerfilePath)/api/Dockerfile
            containerRegistry: $(dockerRegistryServiceConnection)
    
            arguments: --build-arg SECRET=$(secretKey)
    
            tags: |
              $(tag)
    
        - task: Docker@2
          displayName: Push
          inputs:
            command: push
            repository: $(imageRepository)-api
            containerRegistry: $(dockerRegistryServiceConnection)
            tags: |
              $(tag)
    
    
    - upload: manifests
      artifact: manifests
    

    无法获取您的最新信息,解决方法对您有帮助吗?或者,如果您有任何问题,请随意在这里分享。@HughLin MSFT嗯,我希望有一种方法可以通过
    azure pipelines.yml
    和azure DevOps pipelines实现这一点。备选案文1。如果这是不可行的话,下面提供的就是我的想法。@HughLin MSFT将
    参数:--secret
    作为azure管道中处理此问题的方法。yml
    ?是否存在与图像中嵌入的秘密相关的安全问题?意味着包含链接:@HughLin MSFT这是不是在Azure管道和