skip to Main Content

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.

2

Answers


  1. Chosen as BEST ANSWER

    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"
    

  2. 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))

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search