How can i use variable to assigne a service name

Hi

Say I have a .env file that contains the variables I want to pass to the docker-compose.yml file.

.env

STACK_VERSION=8.6.2
SERVICE_NAME=es-sim03
......
......

docker-compose.yml

version: '3.7'
services:
  ${SERVICE_NAME}:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
......
......

How can I use the variable for this service? The above code block show an error:

services Additional property ${SERVICE_NAME} is not allowed

No, you can’t. Service names are supposed to be literal strings.

You can use --project-name (short version: -p ) to specify the project name, which will be prefixed to the container, volume, and network names for a particular compose deployment to prevent naming conflicts with other deployments using the same docker-compose.yml

2 Likes

Thanks Metin

It is really helpful.

Just to give you the full picture:

You could render your compose files through templating of some sort (you would need to solve this yourself) and pass it to docker compose, like this: {command to render template} | docker compose -f - up -d

The -f - uses the compose file it receives via stdin.

Somewhere in the forum, I gave an example that uses envsubst for simple templating.

Update: this is the somewhere

1 Like

It same as the old reply “Little complex to understand” LOL. Still will give it a try.

If you want, you can quote the parts that are unclear to you, write what you understood or assume, then I can try to rephrase the quoted part.

1 Like

You can not use a variable for service name as previously written by @meyay, but you can most definitely use a variable for tags i.e.

service_name:${TAG}

hello,
No, you can’t. Service names are supposed to be literal strings.
You can use different names.

Hey, just wanted to make sure there is still no way to use environment variables in service names nowadays. I would need to specify different service names for several instances of a multi container app running on the same network.

Thanks

No, it is not supported. And will not if nobody asks for the feature :slight_smile:

You can do that here:

My opinion is that when I need a more complex compose file where even service names can be changed, I use a template system. I wouldn’t complicate the compose file parser more. Even now there are some issues with handling variables i compose files when using docker compose config

2 Likes