Search code examples
dockerdocker-compose

How can I set runtime variable for docker compose environment variable


I am creating a docker compose file which requires some environment variables. One of the env var is from aws ssm parameter. So I need to query the value from aws ssm when I build the docker image and put the value as one of the environment variable. How can I do that in docker compose file?

version: "2.3"
services:
  base:
    build:
      context: .
      args:
        - PYTHON_ENV=developmen
        - API_KEY= # find the value from ssm

Solution

  • There is no easy way to process ARGs in docker-compose file from a subshell. But you can do this with docker build command and docker-compose with key-value.

    using the docker-compose command:

    MY_KEY=$(aws  ssm get-parameter --name "test" --output text --query Parameter.Value) docker-compose build --no-cache
    

    docker-compose

    version: "2.3"
    services:
      base:
        build:
          context: .
          args:
            - PYTHON_ENV=developmen
            - API_KEY=${MY_KEY}
    

    Define ARGs in Dockerfile and run subshell during build time to get the SSM parameter value.

    FROM alpine
    ARG API_KEY=default
    ENV API_KEY="$API_KEY"
    RUN echo  "API_KEY is : $API_KEY"
    

    During build get the value using aws-cli

    docker build --no-cache --build-arg API_KEY="$(aws  ssm get-parameter --name "test" --output text --query Parameter.Value)" -t myimage .
    

    With docker-compose you can also try with system environment variable.

    version: "2.3"
    services:
      base:
        build:
          context: .
          args:
            - PYTHON_ENV=developmen
            - API_KEY=${MY_KEY}
    

    Export it as an ENV before docker-compose.

     export MY_KEY=$(aws  ssm get-parameter --name "test" --output text --query Parameter.Value) && docker-compose build --no-cache