Create a function app in a local Linux container
This article shows you how to use Azure Functions Core tools to create your first function in a Linux container on your local computer, verify the function locally, and then publish the containerized function to a container registry. From a container registry, you can easily deploy your containerized functions to Azure.
For a complete example of deploying containerized functions to Azure, which include the steps in this article, see one of the following articles:
- Create your first containerized Azure Functions on Azure Container Apps
- Create your first containerized Azure Functions
- Create your first containerized Azure Functions on Azure Arc (preview)
You can also create a function app in the Azure portal by using an existing containerized function app from a container registry. For more information, see Azure portal create using containers.
Choose your development language
First, you use Azure Functions tools to create your project code as a function app in a Docker container using a language-specific Linux base image. Make sure to select your language of choice at the top of the article.
Core Tools automatically generates a Dockerfile for your project that uses the most up-to-date version of the correct base image for your functions language. You should regularly update your container from the latest base image and redeploy from the updated version of your container. For more information, see Creating containerized function apps.
Prerequisites
Before you begin, you must have the following requirements in place:
Install the .NET 8.0 SDK.
Install Azure Functions Core Tools version 4.0.5198, or a later version.
- Install Azure Functions Core Tools version 4.x.
- Install a version of Node.js that is supported by Azure Functions.
- Install a version of Python that is supported by Azure Functions.
- Install the .NET 6 SDK.
Install a version of the Java Developer Kit that is supported by Azure Functions.
Install Apache Maven version 3.0 or above.
- Azure CLI version 2.4 or a later version.
If you don't have an Azure subscription, create an Azure free account before you begin.
To publish the containerized function app image you create to a container registry, you need a Docker ID and Docker running on your local computer. If you don't have a Docker ID, you can create a Docker account.
You also need to complete the Create a container registry section of the Container Registry quickstart to create a registry instance. Make a note of your fully qualified login server name.
Create and activate a virtual environment
In a suitable folder, run the following commands to create and activate a virtual environment named .venv
. Make sure to use one of the Python versions supported by Azure Functions.
python -m venv .venv
source .venv/bin/activate
If Python didn't install the venv package on your Linux distribution, run the following command:
sudo apt-get install python3-venv
You run all subsequent commands in this activated virtual environment.
Create and test the local functions project
In a terminal or command prompt, run the following command for your chosen language to create a function app project in the current folder:
func init --worker-runtime dotnet-isolated --docker
func init --worker-runtime node --language javascript --docker
func init --worker-runtime powershell --docker
func init --worker-runtime python --docker
func init --worker-runtime node --language typescript --docker
In an empty folder, run the following command to generate the Functions project from a Maven archetype:
mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8 -Ddocker
The -DjavaVersion
parameter tells the Functions runtime which version of Java to use. Use -DjavaVersion=11
if you want your functions to run on Java 11. When you don't specify -DjavaVersion
, Maven defaults to Java 8. For more information, see Java versions.
Important
The JAVA_HOME
environment variable must be set to the install location of the correct version of the JDK to complete this article.
Maven asks you for values needed to finish generating the project on deployment. Follow the prompts and provide the following information:
Prompt | Value | Description |
---|---|---|
groupId | com.fabrikam |
A value that uniquely identifies your project across all projects, following the package naming rules for Java. |
artifactId | fabrikam-functions |
A value that is the name of the jar, without a version number. |
version | 1.0-SNAPSHOT |
Select the default value. |
package | com.fabrikam.functions |
A value that is the Java package for the generated function code. Use the default. |
Type Y
or press Enter to confirm.
Maven creates the project files in a new folder named artifactId, which in this example is fabrikam-functions
.
The --docker
option generates a Dockerfile for the project, which defines a suitable container for use with Azure Functions and the selected runtime.
Navigate into the project folder:
cd fabrikam-functions
Use the following command to add a function to your project, where the --name
argument is the unique name of your function and the --template
argument specifies the function's trigger. func new
creates a C# code file in your project.
func new --name HttpExample --template "HTTP trigger"
Use the following command to add a function to your project, where the --name
argument is the unique name of your function and the --template
argument specifies the function's trigger. func new
creates a subfolder matching the function name that contains a configuration file named function.json.
func new --name HttpExample --template "HTTP trigger"
To test the function locally, start the local Azure Functions runtime host in the root of the project folder.
func start
func start
npm install
npm start
mvn clean package
mvn azure-functions:run
After you see the HttpExample
endpoint written to the output, navigate to that endpoint. You should see a welcome message in the response output.
After you see the HttpExample
endpoint written to the output, navigate to http://localhost:7071/api/HttpExample?name=Functions
. The browser must display a "hello" message that echoes back Functions
, the value supplied to the name
query parameter.
Press Ctrl+C (Command+C on macOS) to stop the host.
Build the container image and verify locally
(Optional) Examine the Dockerfile in the root of the project folder. The Dockerfile describes the required environment to run the function app on Linux. The complete list of supported base images for Azure Functions can be found in the Azure Functions base image page.
In the root project folder, run the docker build command, provide a name as azurefunctionsimage
, and tag as v1.0.0
. Replace <DOCKER_ID>
with your Docker Hub account ID. This command builds the Docker image for the container.
docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
When the command completes, you can run the new container locally.
To verify the build, run the image in a local container using the docker run command, replace <DOCKER_ID>
again with your Docker Hub account ID, and add the ports argument as -p 8080:80
:
docker run -p 8080:80 -it <DOCKER_ID>/azurefunctionsimage:v1.0.0
After the image starts in the local container, browse to http://localhost:8080/api/HttpExample
, which must display the same greeting message as before. Because the HTTP triggered function you created uses anonymous authorization, you can call the function running in the container without having to obtain an access key. For more information, see authorization keys.
After the image starts in the local container, browse to http://localhost:8080/api/HttpExample?name=Functions
, which must display the same "hello" message as before. Because the HTTP triggered function you created uses anonymous authorization, you can call the function running in the container without having to obtain an access key. For more information, see authorization keys.
After verifying the function app in the container, press Ctrl+C (Command+C on macOS) to stop execution.
Publish the container image to a registry
To make your container image available for deployment to a hosting environment, you must push it to a container registry.
Azure Container Registry is a private registry service for building, storing, and managing container images and related artifacts. You should use a private registry service for publishing your containers to Azure services.
Use this command to sign in to your registry instance using your current Azure credentials:
az acr login --name <REGISTRY_NAME>
In the previous command, replace
<REGISTRY_NAME>
with the name of your Container Registry instance.Use this command to tag your image with the fully qualified name of your registry login server:
docker tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Replace
<LOGIN_SERVER>
with the fully qualified name of your registry login server and<DOCKER_ID>
with your Docker ID.Use this command to push the container to your registry instance:
docker push <LOGIN_SERVER>/azurefunctionsimage:v1.0.0
Next steps
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for