Docker-Compose API Call and Endpoint Containerized

Issue

Using docker-compose I’ve got multiple containers running – one of them is the profiler container that calls an API, the other container apiconnection should be receiving the call and sending information back. However when I run the compose file it always returns Get http://apiconnection:8080/maccaption: dial tcp: lookup apiconnection on 127.0.0.11:53: no such host on the Profiler container at the http.DefaultClient.Do line.

This is a sample of my compose file:

apiConnection:
 image: apiconnection:1.0
 ports:
  - "8080:8080"
 networks: 
  - maccaptionNet
profiler:
  image: profiler:1.0
  networks: 
   - maccaptionNet
  depends_on:
   - "apiConnection"

I’m calling the api in my profiler image like so – it’s erroring on DefaultClient:

url := "http://apiconnection:8080/maccaption"

req, err := http.NewRequest("GET", url, nil)
if err != nil {
    log.Fatal(err)
}

res, err := http.DefaultClient.Do(req)
if err != nil {
    fmt.Println("Line 27")
    log.Fatal(err)
}

body, err := ioutil.ReadAll(res.Body)
if err != nil {
    fmt.Println("Line 33")
    log.Fatal(err)
}

If I modify the url := "http://apiconnection:8080/maccaption" to look at localhost like this url := "http://localhost:8080/maccaption" it changes to connect refused, but I don’t think I should be looking at localhost, I need to look at the Docker container don’t I?

I’m setting the url as a connection to the docker container and using the ports I’ve assigned in the docker-compose file.
and receiving the request in my apiconnection image like this:

    r := mux.NewRouter()

r.HandleFunc("/maccaption", handleMaccaption).Methods("GET")

http.ListenAndServe(":8080", r)

All it should be doing now is starting up and making a single request to prove that it is working and returning some json information. This code works outside of docker, replacing the container name in the url variable with localhost. But I cannot get it running within docker.

I’ve looked at these other sources for assistance but to no avail:
how to call api endpoint inside docker container?
Making a REST Call to Endpoint in Dockers
Docker-compose internal communication using endpoints

Any pointers would be greatly appreciated – thank you!

**EDIT – to fix my wonky code formatting

Solution

For anyone who’s attempting to do something like this in the future: the above code actually does work. But where I was going wrong was that in my url := "http://apiconnection:8080/maccaption" I was referring to the image name instead of the service name I’ve defined in the docker-compose.

changing the url to look at the service name instead of the image name corrected the issue and I’m now able to make API calls within my dockerized environment.

Answered By – henleyhoudini

Answer Checked By – David Marino (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.