Alex Poloz
Alex Poloz

Reputation: 486

Docker How to use environment variables in RUN command, not CMD?

I have:

docker-compose.yml

version: "3.9"
services:
    test_name:
        image: ${PROJECT_NAME}/test_service
        build:
            dockerfile: Dockerfile
    env_file: .env

Dockerfile

FROM alpine:3.15

RUN echo $TEST >> test1.txt
CMD echo $TEST >> test2.txt

As result:

test1.txt - empty and test2.txt with data.

My problem is that this variables are too much, so can I get environment variables in RUN command from .env file without enumeration all of them in ARG?

Upvotes: 5

Views: 17210

Answers (1)

The Fool
The Fool

Reputation: 20457

To use variables in a RUN instruction, you need to use ARG. ARG are available at build time while ENV is available when the container runs.

FROM alpine:3.15

ARG FOO="you see me on build"
ENV BAR="you see me on run"

RUN echo $FOO >> test1.txt
CMD echo $BAR >> test2.txt
docker build --build-arg FOO="hi" --tag test .
docker run --env BAR="there" test

There is one thing that comes close to using env variables, but you still need to provide the --build-arg flag.
You can define env variable with the same name as the build arg and reference it by its name without setting a value. The value will be taken from the env variable in your shell.

export FOO="bar"
docker build --build-arg FOO --tag test .

This also works in compose.

Additionally, when you use compose you can place a .env file next to your compose file. Variables found there will be read and are available in the build:arg key as well as the environment key, But you still have to name them.

# env file
FOO=bar
BAZ=qux
services:
  test_name:
      build:
        context: ./
        args:
          FOO:
          BAZ:

Upvotes: 14

Related Questions