Я использую dockerfile и Azure Devops для создания и отправки образа в реестр. У меня есть файл appsettings.development, а также производственные файлы. Мне нужно безопасно внедрить их в свой образ во время сборки.
Мои настройки приложения содержат как секретные, так и несекретные данные, но я слышал, что помещать их в репозиторий — плохая практика. Я делаю это (а не настоящие секреты, мои применяются во время выполнения, некоторые из них используют env), например, docker run -e
Я также видел в других сообщениях использование --build-arg небезопасно.
Итак, как мне реализовать вышеизложенное с точки зрения передовой практики? Я бы предпочел, может быть, пример без хранилища ключей и один с ним. В краткосрочной перспективе возможно использование переменных Azure Devops. Или любые другие рекомендуемые подходы.
Я хочу сделать это во время сборки, поскольку у меня больше контроля над этим пространством.
Докерфайл
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
ARG ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "API.dll"]
Конвейер Azure Devops
trigger: none
pool:
vmImage: 'ubuntu-latest'
steps:
- task: Docker@2
displayName: login
inputs:
containerRegistry: 'docker_registry'
command: login
- task: Docker@2
displayName: build
inputs:
containerRegistry: 'docker_registry'
repository: web/api
command: build
tags: |
latest
arguments: '--build-arg ASPNETCORE_ENVIRONMENT=Development
- task: Docker@2
displayName: push
inputs:
containerRegistry: 'docker_registry'
repository: web/api
command: push
tags: |
latest
1. Используйте Azure DevOps секретные переменные
--build-arg
, например:- task: Docker@2
displayName: build
inputs:
containerRegistry: 'docker_registry'
repository: web/api
command: build
tags: |
latest
arguments: '--build-arg ASPNETCORE_ENVIRONMENT=$(secret)'
2. Используйте секретную переменную в группах переменных или связывайте секреты из хранилища ключей Azure в группах переменных.
variables:
- group: my-variable-group
steps:
- task: Docker@2
displayName: build
inputs:
containerRegistry: 'docker_registry'
repository: web/api
command: build
tags: |
latest
arguments: '--build-arg ASPNETCORE_ENVIRONMENT=$(secret_name_in_variable_group )'
3. Используйте секреты Azure Key Vault. Вы можете следовать инструкциям здесь. Затем вы можете использовать его как следующий yaml
steps:
- task: AzureKeyVault@2
displayName: Azure Key Vault
inputs:
azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
KeyVaultName: 'YOUR_KEY_VAULT_NAME'
SecretsFilter: '*'
RunAsPreJob: false
- task: Docker@2
displayName: build
inputs:
containerRegistry: 'docker_registry'
repository: web/api
command: build
tags: |
latest
arguments: '--build-arg ASPNETCORE_ENVIRONMENT=$(your_secret_name_in_key_vault)'