Dockerized next.js app - not getting environment variables on runtime
Hi there,
I'm having troubles dockerizing my next.js app, at this point I'm able to get it building and using
ARG
to get the environment variables on buildtime but for some reason they're not being passed through on runtime.
Here's my dockerfile:
Solution:Jump to solution
something real funky is going on with your project, try just running normal
next start
123 Replies
Project ID:
19953c85-3aed-4faa-989e-4fb6c0b9d816
19953c85-3aed-4faa-989e-4fb6c0b9d816
Turns out what i said previously did not fix it, I've removed the solved tag for now
Try without the ARG to ENV assignments
hey, yeah I tried that but it didn't seem to work
I'll try and do it again but it doesn't look like it worked the first time
please do, regardless if it does or doesn't work, it's not needed so it's good to rule it out anyway
yeah thats the thing, I had tried that initially and it looked like it was working until i got a message from someone using the service and it turned out it wasn't so 🤷♂️ , redeploying now
also probably a good idea to remove the EXPOSE and ENV PORT lines too
will do, yeah doesn't look like this worked unfortunately
does a standalone next build require variables to be prefixed with something? like NEXT_?
It's strange, the environment variables are being passed on buildtime but not runtime
only when being used in client components
variables are most certainly being passed at runtime, there's just something simple we are overlooking here
but in the cases where I'm using my env vars, no, as it is code being ran on the server rather than the client
and you're sure the environment variables that are missing aren't trying to be statically built into the code?
i mean they shouldn't be, it was working fine when i was using the default nixpacks
i just wanted to use docker so i could specify an image that isn't as RAM intensive
nixpacks includes every single service variable you have as an ARG in its generated dockerfile, so that may explain why it works
so try to specify all your environmental variables as ARGs in the correct layer of your dockerfile
but i'm specifying all of them in every layer, surely they should be available then?
unless i'm misunderstanding how dockerfiles work 😂
you only have 6 service variables?
yes
okay this is getting strange, have you tried a simple console log in the backend for some of those environment variables?
i know for sure that the
DATABASE_URL
and CLIENT_ID
variables are not being passed based on my deploy logs and through my OAuth login where it's setting one of the URL params as &client_id=undefined
from that i'd say it's safe to assume that none of the environment variables are being set properlywould you happen to be committing an .env file to GitHub?
i'm committing an .env.example, but no i'm not committing a .env file
is your code trying to somehow load the .env.example?
i highly doubt it, that's never happened before and like i said the environment variables are working fine in build time where i know at least
DATABASE_URL
is being used
luckily for now i can just rollback to the nixpacks build but it would be nice to get a Dockerfile workingdefinitely something simple we are overlooking here
I'll try to reproduce
very likely, unfortunately the documentation isn't very detailed on what happens with environment variables when using Dockerfiles
the docs do actually cover how to use environment variables during the build, and during runtime there is nothing you need to do because service variables are automatically injected into the containers environment
in that case, let me try not setting
ARG
in the runner layer
maybe they're conflictingARG is short for build arguments, they shouldn't be put into the environment of the built image, but I've seen stranger things
that very well could be it then, new to docker here 😂
nope, still not being set
however i could still be right, let me remove the
ARG
s from the base layer as wellthey should only be needed in the layer that runs commands that use the environment variables
does the
ARG
command actually set it as an environment variable though? or as a variable inside of the docker file, because technically the DATABASE_URL
isn't being used inside of the dockerfile itself, it just needs to be set in order for prisma to generate types
okay looks like that worked!
removing it from the base layer and only setting it in the layers where they're needed fixed it
it looks like that anyways
ugh wait no
i spoke too soonARG is short for build arguments, specifying them brings the build arguments into the build but not the runtime, railway when building from the dockerfile will specify all service variables as build arguments
I'm not quite sure here then, the environment variables are being set fine during the build because next.js is building fine, but then when it gets to runtime they no longer seem to be set
yes I am currently stumped here too
just for debugging purposes, can you change your dockerfile to only use a single FROM?
that's what i've got currently
shall i just remove all of the instances of
FROM
? apart from the first one of coursehaha no you don't
yep that's what I meant!
sorry as in that^^^ is what i've got in my dockerfile currently
ah gotcha, I see what you meant
ugh docker doesn't like my dockerfile
give me a sec
so yeah try with only a single FROM and of course remove all the copy stuff
and for extra good measure, no user / chown stuff either
basically we want the most barebones dockerfile, then if we get that working, you can start adding the fancy stuff back for process of elimination
yeah i removed all of the copy stuff but docker has it all cached and it's a bit screwy
give me a sec
set
NO_CACHE
to 1
apologies, where do i set that?
service variables
ah alright
right it's building now
will keep you updated
woah the docker image is so much bigger?
it's gone from like 60-70MB to 600?
yeah thats the joys of not using a multi stage image haha, but thats too be expected
i'm struggling even getting this dockerfile to work currently
do i need to do something special here
actually i might be missing a copy . . after the build step
what package manager do you use locally?
pnpm, i should probably remove that complicated code as well
oh well no worries, lets see if that
COPY . .
i added sorted itthen youd only want to copy in package.json and pnpm-lock.yaml in the first COPY
i really dislike docker sometimes 😂
haha well whats the status on the missing environment variables?
honestly still haven't got this dockerfile working properly 😂
so i was getting an error that
/app/server.js
wasn't found, which making sense because i removed the COPY commands that copied those files oversimplify it more
and i added them back but because its caching
even though i set NO_CACHE to 1
those folders don't exist technically
what makes you think its caching still?
show me how you have set that variable please
ah apologies, doesn't look like i set the variable correctly
oh but
it's still cached
^
and now it still says CACHED?
yes
hmmm odd
right i think i understood why it wasn't working
do tell!
basically i'm a noob at docker and there's a difference between what COPY and COPY --from does
anyways just waiting for it to build now
oh haha i thought you meant you found out why the runtime envs weren't working
oh nope not yet haha
but i think i've got a minimal dockerfile working at this point so we can work from here
just waiting for the build
this is as minimal of a dockerfile as i can give you
and the environment variables still are not being passed through
it's very very weird
can you show me how you are accessing these environment variables in code?
Literally just through
process.env.<ENVIRONMENT_VARIABLE>
as i said it's worked pretty much everywhere else except using Dockerfilesokay ill try to reproduce
cheers
works fine
obviously an extremely simplified test, but this working means this isnt a platform issue
i've got absolutely no idea why this isn't working then 😂
try doing something like this
yeah i'm actually gonna see if it's being passed down in code
just putting a console.log
do both things
okay now thats super strange
this works
but the code doesn't
now i'm super confused 😂
share your repo? theres a slim chance something sticks out to me
would you mind if i added you to the repo? i don't mind you having a look at the code but i can't make the repo public right now
for sure, body192
i've invited you
looking
welp
i have missspelt my own name
my r key is going bad on my keyboard
my gh username is brody192
Oops 😂😂
my bad
gotcha now :)
got it
feels
yuuuppppp we all go through it once in a while
don't worry about having to blur anything out in screenshots btw i'm not that bothered, the repo just can't be publically accessible haha
so just to be clear, that echo in your start command does work?
yep!
which is honestly why i'm so confused
even more than before 😂
now what would a google search for "nextjs cant read environment variables" come up with haha, since we have ruled out a platform issue
and for fun, can you delete the .env.example file
yep can do
also this is interesting: https://github.com/vercel/next.js/issues/46296
GitHub
Standalone build does not include server-side variables from `.env....
Verify canary release I verified that the issue exists in the latest Next.js canary release Provide environment information Operating System: Platform: darwin Arch: arm64 Version: Darwin Kernel Ver...
now granted, this is coming from .env
but it's interesting
try this?
i would but this doesn't fix the issue with prisma
true, doesnt work for env()
is it possible that prisma can only read from .env files?
prisma is definitely able to read from the environment directly, something funky is going on here and I'm not sure what
i'm going to try explicitly setting
DATABASE_URL
in the dockerfileas an ENV?
yes
at this point i'm trying anything 😂
still nope
curiously
it seems to fail when one the API routes is being hit
there's an API route that gets hit every minute by our discord bot
Solution
something real funky is going on with your project, try just running normal
next start
yep will do
and honestly after this if it doesn't work i'll just go back to nixpacks
the extra 4$ isn't worth it anymore 😂
erm wtf?
so
running pnpm start just
works?
ffs
so next start works
there must be some sort of bug with standalone
it looks like it
i can hit that API endpoint just fine
well then
thanks for all your help
what a fun debug process!
maybe for you 😂
now you can go back to that mutli layer dockerfile!
yep, i might file an issue on the next.js repo for this, it's a pretty weird bug
watch them blame the platform haha
anyways mate, thanks for sticking with me through this whole thing 😂
happy to help!
well now i know for sure it can't be that haha
anyways
marking this as solved, cheers!
oh my god @Brody
i just realized
i bet this is because i'm on a relatively older version of next.js
and there was a PR that literally fixes this exact issue like
1 or 2 patch versions later
UGHHHH
oh well
lmao
learn javascript they said, it will be fun they said
GitHub
fix process.env not being available in standalone mode (#54203) · v...
What?
When running Next in standalone mode,
process.env
is not made
available to the render workers, making it impossible to access
environment variables that aren't provided in `....haha simple fix too