Saurav Pathak
Saurav Pathak

Reputation: 836

How can I pass ENV value in Dockerfile from .env file?

My directory structure looks like this.

|
| --- Dockerfile
| --- .env

Content of .env file looks like this.

VERSION=1.2.0
DATE=2022-05-10

I want to access VERSION and DATE as environment variable both during build time and run time. So ENV is the one I should use. I know that. How exactly can I do that ?

I tried using RUN command in Dockerfile like

RUN export $(cat .env)

But, it can only be accessed during runtime and not build time. So, how can this be achieved with ENV ?

I can do it manually like

ENV VERSION 1.2.0
ENV DATE 2022-05-10

But, it is inefficient when I have many environment variables.

P.S. I cannot use docker-compose because the image is going to be used by kubernetes pods, so.

Upvotes: 3

Views: 9733

Answers (3)

Adam Winter
Adam Winter

Reputation: 1914

What I've read from others says that there is no "docker build --env-file...." option/apparatus. As such, this situation makes a good argument for shifting more of the content of the dockerfile to a shell script that the dockerfile simply copies and runs, as you can source the .env file that way.

greetings.sh

#!/bin/sh

source variables.env
echo Foo $copyFileTest

variables.env

export copyFileTest="Bar"

dockerfile

FROM alpine:latest

COPY variables.env .
RUN source variables.env && echo Foo $copyFileTest  #outputs: Foo Bar
COPY greetings.sh .
RUN chmod +x /greetings.sh
RUN /greetings.sh               #outputs: Foo Bar

RUN echo $copyFileTest          #does not work, outputs nothing

Upvotes: 0

Hatim
Hatim

Reputation: 1522

You can specify the env_file in the docker-compose.dev.yml file as follows:


# docker-compose.dev.yml

services:
  app:
    ...
    env_file:
        - .env.development

and you have to have a .env.development file containing all the environment variables you need to pass to the docker image.

e.g.:

# .env.development

REACT_APP_API_URL="https://some-api-url.com/api/graphql"

Upvotes: -3

Tolis Gerodimos
Tolis Gerodimos

Reputation: 4400

You could firstly export these variables as environmetal variables to your bash

source .env

Then use --build-arg flag to pass them to your docker build

docker image build --build-arg VERSION=$VERSION --build-arg DATE=$DATE .

Next in your dockerfile

ARG VERSION
ARG DATE
ENV version=$VERSION
ENV date=$DATE

As a result, for example you can access the variables in your build phase as VERSION and in your container as version

Upvotes: 7

Related Questions