Set up a 12-Factor app rock¶
The following how-to guide provides instructions on initializing and configuring rocks for 12-factor apps.
Initialize a 12-factor app rock¶
Use rockcraft init and specify the relevant profile:
rockcraft init --profile <profile>
Rockcraft automatically creates a rockcraft.yaml project file
for the rock in your current directory. You will need to check the project
file to verify that the rock’s name and description are correct.
rockcraft init --profile django-framework
rockcraft init --profile expressjs-framework
rockcraft init --profile fastapi-framework
rockcraft init --profile flask-framework
rockcraft init --profile go-framework
For more information, see: init
Include extra files in the OCI image¶
The following files are included in the image by default from the root of the project:
app(does not apply to thego-framework)app.py(does not apply to thego-framework)migratemigrate.shmigrate.py(does not apply to thego-framework)statictemplates
To change this list, add the following snippet to the project file:
parts:
flask-framework/install-app:
prime:
- flask/app/.env
- flask/app/app.py
- flask/app/webapp
- flask/app/templates
- flask/app/static
Note the flask/app/ prefix that is required followed by the relative path to
the project root.
N/A
parts:
fastapi-framework/install-app:
prime:
- app/.env
- app/app.py
- app/webapp
- app/templates
- app/static
Note the app/ prefix that is required followed by the relative path to
the project root.
parts:
go-framework/assets:
prime:
- app/templates
- app/static
- app/migrate.sh
Note the app/ prefix that is required followed by the relative path to
the project root.
Include additional debs in the OCI image¶
If your app requires debs – for example, to connect to a database – add the following snippet to the project file:
parts:
flask-framework/dependencies:
stage-packages:
# list required packages or slices for your flask application below.
- libpq-dev
parts:
django-framework/dependencies:
stage-packages:
# list required packages or slices for your Django application below.
- libpq-dev
parts:
fastapi-framework/dependencies:
stage-packages:
# list required packages or slices for your FastAPI application below.
- libpq-dev
parts:
runtime-debs:
plugin: nil
stage-packages:
- postgresql-client
For the go-framework extension, a deb could be needed for example to use an external command in the migration process.
Override commands¶
The services key follows the Pebble layer specification and defines the entrypoint to your app.
You can override the default service commands in rockcraft.yaml.
To override a service’s command, check the default service
entrypoint generated by the extension by running rockcraft expand-extensions.
Then, adapt the command to your needs and declare it in your project file. For
example:
rockcraft expand-extensions¶# ...
services:
flask:
override: replace
command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app -k [ sync ]
startup: enabled
after:
- statsd-exporter
user: _daemon_
To limit the maximum number of pending connections in Gunicorn to 1024, add the following lines to your project file.
services:
flask:
command: /bin/python3 -m gunicorn -c /flask/gunicorn.conf.py app:app --backlog 1024 -k [ sync ]
rockcraft expand-extensions¶# ...
services:
django:
override: replace
command: /bin/python3 -m gunicorn -c /django/gunicorn.conf.py django_hello_world.wsgi:application -k [ sync ]
startup: enabled
after:
- statsd-exporter
user: _daemon_
# ...
To limit the maximum number of pending connections in Gunicorn to 1024, add the following
lines to rockcraft.yaml.
services:
django:
command: /bin/python3 -m gunicorn -c /django/gunicorn.conf.py django_hello_world.wsgi:application --backlog 1024 -k [ sync ]
rockcraft expand-extensions¶# ...
services:
fastapi:
override: replace
command: /bin/python3 -m uvicorn app:app
startup: enabled
environment:
UVICORN_HOST: 0.0.0.0
user: _daemon_
working-dir: /app
To limit the maximum number of pending connections in uvicorn to 1024, add the following
lines to rockcraft.yaml.
services:
fastapi:
command: /bin/python3 -m uvicorn app:app --backlog 1024
rockcraft expand-extensions¶# ...
services:
go:
override: replace
command: go-hello-world
startup: enabled
user: _daemon_
working-dir: /app
To pass the argument --example-arg to the main Go app, add the following lines
to rockcraft.yaml.
services:
go:
override: replace
command: go-hello-world --example-arg
rockcraft expand-extensions¶# ...
services:
expressjs:
override: replace
command: npm start
startup: enabled
environment:
NODE_ENV: production
user: _daemon_
working-dir: /app
To pass the argument --example-arg to the ExpressJS script, add the following lines
to rockcraft.yaml.
services:
expressjs:
command: npm start -- --example-arg
rockcraft expand-extensions¶# ...
services:
spring-boot:
override: replace
command: bash -c "java -jar *.jar"
startup: enabled
user: _daemon_
working-dir: /app
To enable a debug mode with a flag, add the following lines to rockcraft.yaml.
services:
spring-boot:
command: bash -c "java -jar *.jar --debug"