【发布时间】:2020-04-28 14:18:15
【问题描述】:
为基于 Django 的 API 开发 CI/CD 管道。我需要在构建阶段注入环境变量才能成功构建映像。
-
python manage.py collectstatic在构建镜像时在Dockerfile中运行 -
collectstatic需要settings.py中的SECRET_KEY才能运行 -
SECRET_KEY在这个阶段是空的,因为它是用os.environ['SECRET_KEY]读入的 - 因为是空的,所以构建失败
- 因此,我需要设置环境来拥有这个变量
我无法将这么多的东西放在一起,所以想看看是否有人可以帮助我。
这是我目前所拥有的:
Azure 管道
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"]
构建失败日志(可能没有帮助,因为我知道它失败的原因...SECRET_KEY 不在环境变量中)
Step 8/18 : RUN python manage.py collectstatic
---> Running in 1f42a5c062aa
Traceback (most recent call last):
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 325, in execute
settings.INSTALLED_APPS
File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 79, in __getattr__
self._setup(name)
File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 66, in _setup
self._wrapped = Settings(settings_module)
File "/usr/local/lib/python3.7/site-packages/django/conf/__init__.py", line 157, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/local/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/app/config/settings.py", line 26, in <module>
SECRET_KEY = os.environ['SECRET_KEY']
File "/usr/local/lib/python3.7/os.py", line 679, in __getitem__
raise KeyError(key) from None
KeyError: 'SECRET_KEY'
The command '/bin/sh -c python manage.py collectstatic' returned a non-zero code: 1
##[error]The command '/bin/sh -c python manage.py collectstatic' returned a non-zero code: 1
##[error]The process '/usr/bin/docker' failed with exit code 1
我只是不确定如何在其中获取环境变量。我的方法可能从一开始就完全错误。
那我该怎么办:
- 安全地声明管道中的环境变量?
- 将上述环境变量传递到构建阶段?
谢谢!
【问题讨论】:
-
无法获取最新信息,该解决方法对您有帮助吗?或者,如果您有任何疑问,请随时在此处分享。
-
@HughLin-MSFT 好吧,我希望有一种方法可以使用
azure-pipelines.yml和 Azure DevOps Pipelines 来做到这一点。如果这不可行,下面提供的选项 1 是我的想法。 -
@HughLin-MSFT
arguments: --secret是在azure-pipelines.yml中处理此问题的方法吗?图像中嵌入的机密是否存在与之相关的安全问题? -
@HughLin-MSFT 这对 Azure Pipelines 和
azure-pipelines.yml中的变量不可行吗?又搞砸了几个小时,但没有运气。
标签: azure docker azure-devops dockerfile azure-pipelines