Azure 将env变量注入映像的构建阶段
为基于Django的API开发CI/CD管道。我需要在构建阶段注入环境变量以成功构建映像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] 因为它是空的,所以构建失败 因此,我需要将环境设置为具有此变量 我很难把这么多东西放在一起,所以我想看看是否有人能帮助我
- 生成映像时,
在python manage.py collectstatic
中运行Dockerfile
需要运行collectstatic
中的settings.py
SECRET\u密钥
在此阶段为空,因为它是通过SECRET\u KEY
os.environ['SECRET\u KEY]
- 因为它是空的,所以构建失败
- 因此,我需要将环境设置为具有此变量
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
命令注入环境变量,但这并不安全。钥匙将嵌入图像中
如果希望安全,请选择以下选项:
--networkcontainer:
运行Docker构建,现在您可以向另一个容器发送查询以获取机密。或者类似地在主机上运行webserver,执行--网络主机
更长的writeup,它还提到了其他一些替代方法,比如通过多阶段构建进行复制:您的
python manage.py collectstatic
正在docker容器中运行,它的os.environ['SECRET\u KEY]
将尝试获取它运行的容器的环境变量。但是您在管道中设置的环境变量SECRET_KEY是用于构建代理的
您可以尝试以下步骤将管道环境变量传递给docker容器
1,我在dockerfileARG 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管道和