diegosasw
diegosasw

Reputation: 15624

Name a service in docker compose to be used as a hostname

I want to spin up a database container (e.g: MongoDb) with docker-compose so that I can run some tests against the database.

This is my mongodb.yml docker-compose file.

version: '3.7'
services:
    mongo:
        image: mongo:latest
        restart: always
        ports:
            - 27017:27017
        environment:
            - MONGO_INITDB_ROOT_USERNAME=root
            - MONGO_INITDB_ROOT_PASSWORD=example

    mongo-express:
        image: mongo-express:latest
        restart: always
        ports:
            - 8081:8081
        environment:
            - ME_CONFIG_MONGODB_ADMINUSERNAME=root
            - ME_CONFIG_MONGODB_ADMINPASSWORD=example
        depends_on:
            - mongo

When I run it with docker-compose -f mongodb.yml up I can successfully connect to MongoDb on localhost. In other words, the following connection string is valid: "mongodb://root:example@localhost:27017/admin?ssl=false"

I want to use the equivalent to alias so that instead localhost, MongoDb is accessible through hostname potato

In GitLab CI/CD, with a Docker runner, I can spin up a mongo container and provide an alias without any issue. Like this:

my_ci_cd_job:
  stage: my_stage
  services:
    - name: mongo:latest
      alias: potato
  variables:
    MONGO_INITDB_ROOT_USERNAME: root
    MONGO_INITDB_ROOT_PASSWORD: example

This allows me to connect within the GitLab CI/CD with "mongodb://root:example@potato:27017/admin?ssl=false"

I need the same locally, so that I can reuse my connection string.

I've added under image: mongo:latest the following

container_name: potato

But I cannot connect to the server potato. I've tried a few combinations with network, alias, etc. No luck. I don't event understand what I am doing anymore. Isn't there a simple equivalent to give an alias to a container so that my C# app or MongoDb client can access it?

Even the documentation, at the section https://docs.docker.com/compose/compose-file/#external_links is useless in my opinion. It mentions random samples not defined elsewhere.

Any help is much appreciated!

I've tried..

I've tried the following: How do I set hostname in docker-compose? without success

I have spent a few hours reading the docker compose documentation and it's extremly confusing. The fact that most of the questions are out of context without specific examples, does not help either, because it requires some deeper knowledge.


SOLUTION Thanks to the replies it's clear this is a hacky thing not really recommended.

I went with the recommendations and I have now the connection string as:

mongodb://root:example@potato:27017/admin?ssl=false

by default. That way, I don't need to change anything for my GitLab CI/CD pipeline that has the alias potato for mongo db.

When running locally the mongoDb container with docker compose, it does so in localhost, but I edited my hosts file (e.g: in Windows C:\Windows\System32\drivers\etc, in Linux /etc/hosts) to make any request to potato go to localhost or 127.0.0.1

127.0.0.1  potato

And that way I can connect to MongoDb from my code or Robo3T as if it was running on a host called potato.

Feel free to comment any better alternative if there is. Ta.

Upvotes: 1

Views: 2423

Answers (1)

Christophe De Troyer
Christophe De Troyer

Reputation: 2922

If I understand you correctly, you want to bind a hostname (e.g., potato) to an ip address on your host machine.

Afaik this is not possible, but there are workarounds[1].

Everytime you start your docker-compose a network is used between those containers, and there is no way for you to be sure which ip addresses they will get. These could be 172.17.0.0/24 or 172.14.0.0/24 or anything else really.

The only thing you know for sure is that your host will have a service running at port 27017. So you could say that the hostname potato points to localhost on your hostmachine by adding 127.0.0.1 potato to your /etc/hosts file on your host.

That way the connection string "mongodb://root:example@localhost:27017/admin?ssl=false" will point to the local port from the perspective of your host machine, while it will point to the docker container from the perspective of the rest of your docker-compose services.

I do have to say that I find this a hacky approach, and as @DavidMaze said, it's normal to need different connection strings depending on the context you use them in.

[1] https://github.com/dlemphers/docker-local-hosts

Upvotes: 2

Related Questions