DocsWith Env Vars
Passing ParamsWith Env Vars

Passing parameters as environment variables requires that you set the proper handling of environment variables in your programs.

Overview

Oftentimes you will need to expose an input or a context meta data as an environment variable, in some other situations you might want to skip creating a CLI to run a program and handle the logic based on the environment variables exposed in the system.

Polyaxon exposes the full Kubernetes container specification, which means that you can leverage the env sub-section to expose environment variables:

Example

Let's look at a simple program that just prints some information based on an environment variable:

import os

if __name__ == '__main__':
    print(os.environ.get("INPUT_MESSAGE", "Default message"))

In order to run this program, we can use the following polyaxonfile echo.yaml:

version: 1.1
kind: component
inputs:
- name: message
  type: str
  isOptional: true
  value: "Default message"
run:
  kind: job
  init:
    - file:
        content: |
          import os

          if __name__ == '__main__':
              print(os.environ.get("INPUT_MESSAGE", "Default message"))

        filename: echo.py
  container:
    image: polyaxon/polyaxon-quick-start
    workingDir: "{{ globals.artifacts_path }}"
    command: [python3, -u, echo.py]
    env:
      - name: INPUT_MESSAGE
        value: "{{ message }}"

Now you can run multiple version of this example:

polyaxon run -f echo.yaml -P message="test 1" -l
polyaxon run -f echo.yaml -P message="test 2" -l

Exposing inputs/outputs to env var

N.B: Requires CLI >= v1.12.

To improve the previous process, Polyaxon IO/Params specification has an option to expose the value to an environment variable automatically. Instead of manually using the configuration:

    env:
      - name: INPUT_MESSAGE
        value: "{{ message }}"

It's possible to use the specification toEnv to tell Polyaxon to expose the variable:

inputs:
- name: message
  type: str
  isOptional: true
  value: "Default message"
  toEnv: INPUT_MESSAGE  # <----

toEnv is also available on the params specification, in case the component does not define if the IO should expose the value to an env var, or in case a param is used as context only:

params:
  message:
    value: "New message"
    toEnv: ENV_VAR_MESSAGE  # <----