Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute command on host during docker build

Is it possible to create Dockerfile that executes a command on host when image is being build?

Now I'm doing:

./script_that_creates_magic_file.sh docker build . 

with Dockerfile:

FROM alpine COPY magic_file 

I want to be able to do:

docker build . 

with Dockerfile:

FROM alpine # invoke script_that_creates_magic_file.sh on the host COPY magic_file 

Of course, this script is in the same directory as Dockerfile.

like image 454
Piotr Aleksander Chmielowski Avatar asked Mar 11 '17 12:03

Piotr Aleksander Chmielowski


1 Answers

(Just a suggestion)

We usually have the following structure for building our docker images:

my-image/ ├── assets │   ├── entrypoint.sh │   └── install.sh ├── build.sh ├── Dockerfile ├── README.md └── VERSION 
  • build.sh: This is were you should invoke script_that_creates_magic_file.sh. Other common tasks involve downloading required files or temporarily copying ssh keys from the host. Finally, this script will call docker build .
  • Dockerfile: As usual, but depending on the number of commands we need to run we might have an install.sh
  • install.sh: This is copied and run inside the container, installs packages, removes unnecessary files, etc. Without being 100% sure - I think such an approach reduces the number of layers avoiding multiple commands in a single RUN
  • entrypoint.sh: Container's entrypoint. Allows us to perform tasks when the container starts (like parse environment variables) and print debugging info

I find the above structure convenient and self-documented since everyone in the team can build any image (no special instructions/steps). The README is there to explain what the image is doing... but I won't lie to you... it is usually empty... (or has an h1 for the gitlab to display) :)

like image 82
urban Avatar answered Sep 28 '22 20:09

urban