Question: I'm trying to create a ENV VAR called SETTINGS in a Python image with Dockerfile. This env var must be dynamic, because I need to change the conf profile betweet production and preproduction.

I've created an script (entrypoint.sh) with two commands, the first one create the SETTINGS VAR and the second one is a python command.

The problem is that the python line works properly but the SETTINGS var doesn't.

Script

```
#!/bin/bash
profile=$profile
export SETTINGS=/acalls-service/${profile}.cfg
python -m "_acalls_clasiffier" 
exec

```

Dockerfile

```
ENTRYPOINT ["/bin/bash", "-c", ". entrypoint.sh"]

```

I've tried with ["./entrypoint.sh] also but I doesn't work.

Answer: 
This would be a pretty typical use of an entrypoint wrapper script. Remember that a container only runs a single process. If your Dockerfile specifies an `ENTRYPOINT`, that's the process, and the `CMD` is passed as additional arguments to it. That lets you set up a script that does some first-time setup and then replaces itself with the real command:

```sh
#!/bin/sh

# Set the environment variable
export SETTINGS=/acalls-service/${profile}.cfg

# Run the CMD
exec "$@"

```

In your Dockerfile you'd specify this script as the `ENTRYPOINT` and then the actual command as `CMD`.

```sh
ENTRYPOINT ["./entrypoint.sh"]             # must be JSON-array syntax
CMD ["python", "-m", "_acalls_clasiffier"] # shell syntax allowed here too

```

Since you can easily provide a replacement `CMD`, you can check that this is working

```sh
docker run --rm myimage \
  sh -c 'echo $SETTINGS'  # <-- run in the container, single-quoted so the
                          #     host shell doesn't expand it

```

If you get a debugging shell in the container with `docker exec`, it won't see the variable set because it doesn't run through the entrypoint sequence. That's not usually a practical problem. You can always `docker run` a new container with an interactive shell instead of the Python script.
There is a difference in passing a `dynamic` environment var on `docker build` or pass the variable on runtime.

Env vars on runtime
===================

If you want to pass it on runtime, it doesn't need to be in your Dockerfile, just pass it when running your container:

```
docker run my-image -e MY_ENV=foo

```

Env vars on build
=================

During build you have to:

* define your env var in your Dockerfile
* pass the env var into the build process

Example Dockerfile:

```
  ARG MY_BUILD_ARG=myDefaultArgument

  FROM node:16.9.0

  ARG MY_BUILD_ARG

  ENV MY_PUBLIC_ENV=${MY_BUILD_ARG}

  RUN echo ${MY_PUBLIC_ENV} // => myRandomEnvVar

```

And then pass it when you build as:

```
docker build --build-arg MY_BUILD_ARG=myRandomEnvVar

```