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":
- my browser – the app serves up static HTML/JS to my browser where communicating with
https://api.cancourier.local
works fine - on the pod itself – running some things (ie.
_middleware
) on the pod itself, where the pod does not currently know whathttps://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
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:which augments the devcontainer's
/etc/hosts
with:then in my
Makefile
where I store mykubectl
commands I am simply running:then within my helm chart I can use the following for the pod running my Next.js app:
Highly recommend following this tutorial: Container environment variables
In this tutorial, 2 methods are mentioned:
Choose which is more comfortable for you, good luck))