instruction: Create a Dockerfile for fundamentals
output: ```dockerfile
  from Docker if running on a self-hosted Linux agent.How the pipeline worksStep 1: Define pipeline triggers
  
  trigger:
   - main
  
  pr:
   - mainThis pipeline is triggered automatically on:Commits pushed to the main branchPull requests targeting main main branch
  TipLearn more: Define pipeline triggers in Azure PipelinesStep 2: Define common variables
  
  variables:
   imageName: 'docker.io/$(dockerUsername)/my-image'
   buildTag: '$(Build.BuildId)'
   latestTag: 'latest'These variables ensure consistent naming, versioning, and reuse throughout the pipeline steps:imageName: your image path on Docker HubbuildTag: a unique tag for each pipeline runlatestTag: a stable alias for your most recent image
  ImportantThe variable dockerUsername is not set automatically.Set it securely in your Azure DevOps pipeline variables:Go to Pipelines > Edit > VariablesAdd dockerUsername with your Docker Hub usernameLearn more: Define and use variables in Azure PipelinesStep 3: Define pipeline stages and jobs
  
  stages:
   - stage: BuildAndPush
   displayName: Build and Push Docker ImageThis stage executes only if the source branch is main.
  TipLearn more: Stage conditions in Azure PipelinesStep 4: Job configuration
  
  jobs:
   - job: DockerJob
   displayName: Build and Push
   pool:
   vmImage: ubuntu-latest
   demands:
   - dockerThis job utilizes the latest Ubuntu VM image with Docker support, provided by Microsoft-hosted agents. It can be replaced with a custom pool for self-hosted agents if necessary.
  TipLearn more: Specify a pool in your pipelineStep 4.1: Checkout code
  
  steps:
   - checkout: self
   displayName: Checkout CodeThis step pulls your repository code into the build agent, so the pipeline can access the Dockerfile and application files.
  TipLearn more: checkout step documentationStep 4.2: Authenticate to Docker Hub
  
  - task: Docker@2
   displayName: Docker Login
   inputs:
   command: login
   containerRegistry: 'my-docker-registry' # Replace with your service connection nameUses a pre-configured Azure DevOps Docker registry service connection to authenticate securely without exposing credentials directly.
  TipLearn more: Use service connections for Docker HubStep 4.3: Build the Docker image
  
   - task: Docker@2
   displayName: Build Docker Image
   inputs:
   command: build
   repository: $(imageName)
   tags: |
   $(buildTag)
   $(latestTag)
   dockerfile: './Dockerfile'
   arguments: |
   --sbom=true
   --attest type=provenance
   --cache-
  ```