Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing variable from container start to file

I have the following lines in a Dockerfile where I want to set a value in a config file to a default value before the application starts up at the end and provide optionally setting it using the -e option when starting the container.

I am trying to do this using Docker's ENV commando

 ENV CONFIG_VALUE default_value
 RUN sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE
 CMD command_to_start_app

I have the string CONFIG_VALUE explicitly in the file CONFIG_FILE and the default value from the Dockerfile gets correctly substituted. However, when I run the container with the added -e CONFIG_VALUE=100 the substitution is not carried out, the default value set in the Dockerfile is kept.

When I do

docker exec -i -t container_name bash

and echo $CONFIG_VALUE inside the container the environment variable does contain the desired value 100.

like image 678
tco25 Avatar asked May 17 '15 15:05

tco25


2 Answers

That shouldn't be possible in a Dockerfile: those instructions are static, for making an image.

If you need runtime instruction when launching a container, you should code them in a script called by the CMD directive.
In other words, the sed would take place in a script that the CMD called. When doing the docker run, that script would have access to the environment variable set just before said docker run.

like image 138
VonC Avatar answered Oct 17 '22 13:10

VonC


Instructions in the Dockerfile are evaluated line-by-line when you do docker build and are not re-evaluated at run-time.

You can still do this however by using an entrypoint script, which will be evaluated at run-time after any environment variables have been set.

For example, you can define the following entrypoint.sh script:

#!/bin/bash

sed -i 's/CONFIG_VALUE/'"$CONFIG_VALUE"'/g' CONFIG_FILE
exec "$@"

The exec "$@" will execute any CMD or command that is set.

Add it to the Dockerfile e.g:

COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

Note that if you have an existing entrypoint, you will need to merge it with this one - you can only have one entrypoint.

Now you should find that the environment variable is respected i.e:

docker run -e CONFIG_VALUE=100 container_name cat CONFIG_FILE

Should work as expected.

like image 29
Adrian Mouat Avatar answered Oct 17 '22 11:10

Adrian Mouat