Home > Net >  Pass docker host ip as env var into devcontainer
Pass docker host ip as env var into devcontainer

Time:02-18

I am trying to pass an environment variable into my devcontainer that is the output of a command run on my dev machine. I have tried the following in my devcontainer.json with no luck:

"initializeCommand": "export DOCKER_HOST_IP=\"$(ifconfig | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}' | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)\"",
  "containerEnv": {
    "DOCKER_HOST_IP1": "${localEnv:DOCKER_HOST_IP}",
    "DOCKER_HOST_IP2": "${containerEnv:DOCKER_HOST_IP}"
  },

and

"runArgs": [
  "-e DOCKER_HOST_IP=\"$(ifconfig | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}' | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)\"
],

(the point of the ifconfig/grep piped command is to provide me with the IP of my docker host which is running via Docker for Desktop (Mac))

Some more context

Within my devcontainer I am running some kubectl deployments (to a cluster running on Docker for Desktop) where I would like to configure a hostAlias for a pod (docs) such that that pod will direct requests to https://api.cancourier.local to the ip of the docker host (which would then hit an ingress I have configured for that CNAME).

I could just pass in the output of the ifconfig command to my kubectl command when running from within the devcontainer. The problem is that I get two different results from this depending on whether I am running it on my host (10.0.0.89) or from within the devcontainer (10.1.0.1). 10.0.0.89 in this case is the "correct" IP as if I curl this from within my devcontainer, or my deployed pod, I get the response I'd expect from my ingress.

I'm also aware that I could just use the name of my k8s service (in this case api) to communicate between pods, but this isn't ideal. As for why, I'm running a Next.js application in a pod. The Next.js app on this pod has two "contexts":

  1. my browser - the app serves up static HTML/JS to my browser where communicating with https://api.cancourier.local works fine
  2. on the pod itself - running some things (ie. _middleware) on the pod itself, where the pod does not currently know what https://api.cancourier.local

What I was doing to temporarily get around this was to have a separate config on the pod, one for the "browser context" and the other for things running on the pod itself. This is less than ideal as when I go to deploy this Next.js app (to Vercel) it won't be an issue (as my API will be deployed on some publicly accessible CNAME). If I can accomplish what I was trying to do above, I'd be able to avoid this.

CodePudding user response:

So I didn't end up finding a way to pass the output of a command run on the host machine as an env var into my devcontainer. However I did find a way to get the "correct" docker host IP and pass this along to my pod.

In my devcontainer.json I have this:

"runArgs": [
    // https://stackoverflow.com/a/43541732/3902555
    "--add-host=api.cancourier.local:host-gateway",
    "--add-host=cancourier.local:host-gateway"
  ],

which augments the devcontainer's /etc/hosts with:

192.168.65.2    api.cancourier.local
192.168.65.2    cancourier.local

then in my Makefile where I store my kubectl commands I am simply running:

deploy-the-things:
    DOCKER_HOST_IP = $(shell cat /etc/hosts | grep 'api.cancourier.local' | awk '{print $$1}')
    helm upgrade $(helm_release_name) $(charts_location) \
        --install \
        --namespace=$(local_namespace) \
        --create-namespace \
        -f $(charts_location)/values.yaml \
        -f $(charts_location)/local.yaml \
        --set cwd=$(HOST_PROJECT_PATH) \
        --set dockerHostIp=$(DOCKER_HOST_IP) \
        --debug \
        --wait

then within my helm chart I can use the following for the pod running my Next.js app:

      hostAliases:
        - ip: {{ .Values.dockerHostIp }}
          hostnames:
            - "api.cancourier.local"

CodePudding user response:

Highly recommend following this tutorial: Container environment variables

In this tutorial, 2 methods are mentioned:

  1. Adding individual variables
  2. Using env file

Choose which is more comfortable for you, good luck))

  • Related