Photo par Stefan Steinbauer

Comment utiliser des secrets dans votre build Docker avec Azure DevOps

Utilisez des secrets dans vos Dockerfiles

Créé par Damien Aicheh le 15/08/2022 · 5 mins

Lorsque vous créez une image Docker, vous devez souvent utiliser des secrets pour pouvoir récupérer certaines dépendances. Pour les télécharger, vous devez passer des informations d’identification dans votre Dockerfile. Mais comment le faire correctement ?

Dans ce tutoriel, vous verrez comment transmettre les informations d’identification à l’intérieur de votre pipeline Azure DevOps dans votre Dockerfile pour builder une image Docker avec succès.

Cas d’utilisation

Imaginons que vous deviez builder un projet dotnet, mais que vous ayez des packages nugets stockés dans la section des artifacts Azure DevOps. Le Dockerfile pour builder le projet devrait ressembler à ceci :

FROM mcr.microsoft.com/dotnet/aspnet:6.0-focal AS base
WORKDIR /app

ENV ASPNETCORE_URLS=http://+:5100

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

FROM mcr.microsoft.com/dotnet/sdk:6.0-focal AS build

COPY ["src/DemoProject/DemoProject.csproj", "src/DemoProject/"]

## Restore section
RUN dotnet restore "src/DemoProject/DemoProject.csproj" 

COPY ./src ./src
WORKDIR "/src/DemoProject"
RUN dotnet publish "DemoProject.csproj" -c Release --no-restore -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 5100
ENTRYPOINT ["dotnet", "DemoProject.dll"]

Lorsque Docker commencera à exécuter la commande restore, il échouera car pour accéder aux packages nugets dans les artifacts Azure DevOps à partir du Dockerfile, vous devez ajouter une nouvelle source de nuget. Mais pour ajouter une nouvelle source de nuget, vous devez fournir un jeton d’accès personnel (PAT) pour vous authentifier.

Déclarez un secret dans un Dockerfile

Pour transmettre correctement un secret, vous devez utiliser Docker BuildKit. C’est très simple, vous “montez” le secret avec un identifiant : id et une destination : dst, les deux peuvent être identiques.

Ainsi, dans notre cas d’utilisation, nous montons le AZURE_DEVOPS_PAT qui contiendra le jeton d’accès personnel pour Azure DevOps :

--mount=type=secret,id=AZURE_DEVOPS_PAT,dst=/AZURE_DEVOPS_PAT

Ensuite, nous pouvons ajouter une nouvelle source de nugets avec le AZURE_DEVOPS_PAT comme mot de passe :

dotnet nuget add source --username USERNAME --password `cat /AZURE_DEVOPS_PAT` --store-password-in-clear-text --name common_nugets "https://pkgs.dev.azure.com/<YOUR-ORGANISATION-NUGET-FEED>/index.json"

Ainsi, la commande restore sera:

RUN --mount=type=secret,id=AZURE_DEVOPS_PAT,dst=/AZURE_DEVOPS_PAT \
    dotnet nuget add source --username USERNAME --password `cat /AZURE_DEVOPS_PAT` --store-password-in-clear-text --name common_nugets "https://pkgs.dev.azure.com/<YOUR-ORGANISATION-NUGET-FEED>/index.json" && \
    dotnet restore "src/Project/Project.csproj" 

Builder l’image Docker

Maintenant que le Dockerfile est correctement configuré, voyons comment créer l’image dans Azure DevOps.

Pour créer l’image, vous pouvez utiliser la task Bash@3 et exécuter cette commande :

- task: Bash@3
  displayName: Docker build image
  inputs:
    targetType: inline
    script: |
      docker build \
      --secret id=AZURE_DEVOPS_PAT \
      -t $<YOUR_ACR_LOGIN_URL>/<YOUR_DOCKER_IMAGE>:<YOUR_DOCKER_TAG> .
  env:
    AZURE_DEVOPS_PAT: <VALUE_FROM_YOUR_AZURE_DEVOPS_SECRETS>
    DOCKER_BUILDKIT: 1

Plusieurs choses sont importantes à noter ci-dessus :

  • Vous devez définir une variable d’environnement AZURE_DEVOPS_PAT et lui attribuer la bonne valeur. Assurez-vous de stocker le PAT dans une variable sécurisée à l’intérieur d’un groupe de variables d’Azure DevOps. Si vous n’êtes pas familier avec les groupes de variables, vous pouvez consulter mon précédent tutoriel à ce sujet.

  • Vous définissez l’identifiant secret avec la même variable d’environnement AZURE_DEVOPS_PAT comme ceci : --secret id=AZURE_DEVOPS_PAT.

  • Pour pouvoir monter des secrets dans Docker avec Docker BuildKit, vous devez définir la variable d’environnement DOCKER_BUILDKIT sur 1 pour l’activer.

Touche finale

Vous savez maintenant comment passer correctement vos secrets dans votre Dockerfile avec Azure DevOps. Bien entendu, vous pouvez passer autant de secrets que vous le souhaitez.

Happy coding!

N'hésitez pas à me suivre sur pour ne pas rater mon prochain tutoriel !