Containerized WebApi
The goal of this readme is to show how to build a container WebApi image that can be used to deploy the application into a container registry and that can be used later to run the service.
Build and List Runtime Image
Use docker
to build the WebApi images. (Note: Make sure the run docker
at
the root branch)
cd ./$(git rev-parse --show-cdup)/src
docker build -t carbon_aware:v1 -f CarbonAware.WebApi/src/Dockerfile .
List carbon_aware
image
docker image ls carbon_aware
REPOSITORY TAG IMAGE ID CREATED SIZE
carbon_aware v1 6293e2528bf2 About an hour ago 230MB
Run WebApi Image
-
Run the image using
docker run
with host port 8000 mapped to the WebApi port 80 and configure environment variable settings for WattTime provider.docker run --rm -p 8000:80 \
> -e DataSources__EmissionsDataSource="WattTime" \
> -e DataSources__ForecastDataSource="WattTime" \
> -e DataSources__Configurations__WattTime__Type="WattTime" \
> -e DataSources__Configurations__WattTime__password="username" \
> carbon_aware:v1or the ElectricityMaps provider
docker run --rm -p 8000:80 \
> -e DataSources__EmissionsDataSource="ElectricityMaps" \
> -e DataSources__ForecastDataSource="ElectricityMaps" \
> -e DataSources__Configurations__ElectricityMaps__Type="ElectricityMaps" \
> -e DataSources__Configurations__ElectricityMaps__APITokenHeader="auth-token" \
> -e DataSources__Configurations__ElectricityMaps__APIToken="<YOUR_ELECTRICITYMAPS_TOKEN>" \
> carbon_aware:v1or the ElectricityMapsFree provider
docker run --rm -p 8000:80 \
> -e DataSources__EmissionsDataSource="ElectricityMapsFree" \
> -e DataSources__Configurations__ElectricityMapsFree__Type="ElectricityMapsFree" \
> -e DataSources__Configurations__ElectricityMapsFree__token="<YOUR_CO2SIGNAL_TOKEN>" \
> carbon_aware:v1 -
Verify that the WebApi is responding to requests using an HTTP client tool (e.g.
postman
,curl
)curl -v -s -X 'POST' http://localhost:8000/emissions/forecasts/batch -H 'accept: */*' -H 'Content-Type: application/json' -d '[
{
"requestedAt": "2021-11-01T00:00:00Z",
"dataStartAt": "2021-11-01T00:05:00Z",
"dataEndAt": "2021-11-01T23:55:00Z",
"windowSize": 5,
"location": "eastus"
}
]'
...
> POST /emissions/forecasts/batch HTTP/1.1
> Host: localhost:8000
...
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
...
<
[{"generatedAt":"2021-11-01T00:00:00+00:00","optimalDataPoint":{
...
}}]
Upload Image to a Container Registry
For easy image consumption, upload it to a well-known container registry, self-hosted or managed. The following are examples of using docker hub or Azure Container Registry
Docker Hub
Sign in to Docker Hub and create a private (or public) repository (e.g <your-username>/my-private-repo)
-
Build and Push
docker login --username=your-username
cd ./$(git rev-parse --show-cdup)/src
docker build -t <your-username>/my-private-repo/carbon_aware:v1 -f CarbonAware.WebApi/src/Dockerfile .
docker push <your-username>/my-private-repo/carbon_aware:v1 -
Pull
docker login --username=your-username
docker pull <your-username>/my-private-repo/carbon_aware:v1
Azure Container Registry
-
Build and Push image Assuming the container registry is already created, use the user's credentials push the image using
docker
(it can be done also using Azure CLI)docker login <myacrname>.azurecr.io -u username -p <CopiedKeyFromAzurePortal>
cd ./$(git rev-parse --show-cdup)/src
docker build -t <myacrname>.azurecr.io/carbon_aware:v1 -f CarbonAware.WebApi/src/Dockerfile .
docker push <myacrname>.azurecr.io/carbon_aware:v1 -
Pull image
docker login <myacrname>.azurecr.io -u username -p <CopiedKeyFromAzurePortal>
docker pull <myacrname>.azurecr.io/carbon_aware:v1
Pipeline Integration (Github Action)
To automate an image deployment from a GitHub CI/CD pipeline, the following link
provides detailed information on how to build a workflow
with all the
necesarily tools in order to push an image to a container registry of user's
preference (i.e. Docker Hub).