docker-compose config invalid output when replacing env variables

  docker, docker-compose

I’m trying to generate multiple instances of the same git repository with a generic docker-compose.yml file and multiple .env files.

For this somewhere in the code I generate a temporary folder which contains:

.env:

APP_PORT="3000"
APP_NAME="app-name"
REPO_NAME="repo-name"

docker-compose.yml

version: '3.6'
services:
  web-app:
    image: golang:alpine
    environment:
      - APP_PORT
      - APP_NAME
      - REDIS_HOST=db-app
    ports:
      - ${APP_PORT}:${APP_PORT}
    volumes:
      - /opt/docker/repositories/${REPO_NAME}:/app
    command: sh -c "cd /app && go run ./"
  db-app:
    image: redis:alpine

then running docker-compose config in this directory gives me the following output :

services:
  db-app:
    image: redis:alpine
  web-app:
    command: sh -c "cd /app && go run ./"
    environment:
      APP_NAME: app-name
      APP_PORT: '3000'
      REDIS_HOST: db-app
    image: golang:alpine
    ports:
    - published: 3000
      target: 3000
    volumes:
    - /opt/docker/repositories/repo-name:/app:rw
version: '3.6'

This did not only interpolate env variables, it also changed some fields such as ports with published and target, and a :rw at the end of my volume.

This is all done in Go, and when I try to unmarshal the output into a Go struct with yaml fields, it is not recognized as a valid docker-compose file because of the ports field (which is supposed to be an array of strings).

How can I make it so docker-compose config only replaces the ${APP_PORT} with its value and not add these extra unwanted fields ?

Source: Docker Questions

LEAVE A COMMENT