DMR examples
See some examples of complete workflows using Docker Model Runner.
Sample project
You can now start building your generative AI application powered by Docker Model Runner.
If you want to try an existing GenAI application, follow these steps:
Set up the sample app. Clone and run the following repository:
$ git clone https://github.com/docker/hello-genai.git
In your terminal, go to the
hello-genai
directory.Run
run.sh
to pull the chosen model and run the app.Open your app in the browser at the addresses specified in the repository README.
You see the GenAI app's interface where you can start typing your prompts.
You can now interact with your own GenAI app, powered by a local model. Try a few prompts and notice how fast the responses are — all running on your machine with Docker.
Use Model Runner in GitHub Actions
Here is an example of how to use Model Runner as part of a GitHub workflow. The example installs Model Runner, tests the installation, pulls and runs a model, interacts with the model via the API, and deletes the model.
name: Docker Model Runner Example Workflow
permissions:
contents: read
on:
workflow_dispatch:
inputs:
test_model:
description: 'Model to test with (default: ai/smollm2:360M-Q4_K_M)'
required: false
type: string
default: 'ai/smollm2:360M-Q4_K_M'
jobs:
dmr-test:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Set up Docker
uses: docker/setup-docker-action@v4
- name: Install docker-model-plugin
run: |
echo "Installing docker-model-plugin..."
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-model-plugin
echo "Installation completed successfully"
- name: Test docker model version
run: |
echo "Testing docker model version command..."
sudo docker model version
# Verify the command returns successfully
if [ $? -eq 0 ]; then
echo "✅ docker model version command works correctly"
else
echo "❌ docker model version command failed"
exit 1
fi
- name: Pull the provided model and run it
run: |
MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}"
echo "Testing with model: $MODEL"
# Test model pull
echo "Pulling model..."
sudo docker model pull "$MODEL"
if [ $? -eq 0 ]; then
echo "✅ Model pull successful"
else
echo "❌ Model pull failed"
exit 1
fi
# Test basic model run (with timeout to avoid hanging)
echo "Testing docker model run..."
timeout 60s sudo docker model run "$MODEL" "Give me a fact about whales." || {
exit_code=$?
if [ $exit_code -eq 124 ]; then
echo "✅ Model run test completed (timed out as expected for non-interactive test)"
else
echo "❌ Model run failed with exit code: $exit_code"
exit 1
fi
}
- name: Test model pull and run
run: |
MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}"
echo "Testing with model: $MODEL"
# Test model pull
echo "Pulling model..."
sudo docker model pull "$MODEL"
if [ $? -eq 0 ]; then
echo "✅ Model pull successful"
else
echo "❌ Model pull failed"
exit 1
fi
# Test basic model run (with timeout to avoid hanging)
echo "Testing docker model run..."
timeout 60s sudo docker model run "$MODEL" "Give me a fact about whales." || {
exit_code=$?
if [ $exit_code -eq 124 ]; then
echo "✅ Model run test completed (timed out as expected for non-interactive test)"
else
echo "❌ Model run failed with exit code: $exit_code"
exit 1
fi
}
- name: Test API endpoint
run: |
MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}"
echo "Testing API endpoint with model: $MODEL"
# Test API call with curl
echo "Testing API call..."
RESPONSE=$(curl -s http://localhost:12434/engines/llama.cpp/v1/chat/completions \
-H "Content-Type: application/json" \
-d "{
\"model\": \"$MODEL\",
\"messages\": [
{
\"role\": \"user\",
\"content\": \"Say hello\"
}
],
\"top_k\": 1,
\"temperature\": 0
}")
if [ $? -eq 0 ]; then
echo "✅ API call successful"
echo "Response received: $RESPONSE"
# Check if response contains "hello" (case-insensitive)
if echo "$RESPONSE" | grep -qi "hello"; then
echo "✅ Response contains 'hello' (case-insensitive)"
else
echo "❌ Response does not contain 'hello'"
echo "Full response: $RESPONSE"
exit 1
fi
else
echo "❌ API call failed"
exit 1
fi
- name: Test model cleanup
run: |
MODEL="${{ github.event.inputs.test_model || 'ai/smollm2:360M-Q4_K_M' }}"
echo "Cleaning up test model..."
sudo docker model rm "$MODEL" || echo "Model removal failed or model not found"
# Verify model was removed
echo "Verifying model cleanup..."
sudo docker model ls
echo "✅ Model cleanup completed"
- name: Report success
if: success()
run: |
echo "🎉 Docker Model Runner daily health check completed successfully!"
echo "All tests passed:"
echo " ✅ docker-model-plugin installation successful"
echo " ✅ docker model version command working"
echo " ✅ Model pull and run operations successful"
echo " ✅ API endpoint operations successful"
echo " ✅ Cleanup operations successful"