Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker-compose.yml file that builds a base image, then children based on it?

Tags:

For clarification, when I say base image, I mean the parent image that has all the common configurations, so that the children based on it don't need to download the dependencies individually.

From my understanding, docker-compose.yml files are the run-time configurations, while Dockerfiles are the build-time configurations. However, there is a build option using docker-compose, and I was wondering how I could use this to build a base image.

As of right now, I use a shellscript that runs other shellscripts. One builds all my images, from a base image that it also creates. The other runs them as containers with the necessary configurations. However, the base image is never ran as a container.

Currently, the shellscript I hope to change into a docker-compose file, looks like so:

echo "Creating docker network net1" docker network create net1  echo "Running api as a container with port 5000 exposed on net1" docker run --name api_cntr --net net1 -d -p 5000:5000 api_img  echo "Running redis service with port 6379 exposed on net1" docker run --name message_service --net net1 -p 6379:6379 -d redis  echo "Running celery worker on net1" docker run --name celery_worker1 --net net1 -d celery_worker_img  echo "Running flower HUD on net1 with port 5555 exposed" docker run --name flower_hud --net net1 -d -p 5555:5555 flower_hud_img 

The shellscript that makes the images, is as follows:

echo "Building Base Image" docker build -t base ../base-image  echo "Building api image from Dockerfile" docker build -t api_img  ../api  echo "Building celery worker image" docker build -t celery_worker_img ../celery-worker  echo "Building celery worker HUD" docker build -t flower_hud_img ../flower-hud 

My questions comes down to one thing, can I create this Base image without ever running it in a container with docker-compose. (All the Dockerfiles start with FROM base:latest other than the base itself). I'm looking to make it as easy as possible for other people, so that they only have to run a single command.

EDIT: I am using version 3, and acording to the docs, build: is ignored, and docker-compose only accepts pre-built images.

like image 249
Will Parzybok Avatar asked Jul 18 '17 17:07

Will Parzybok


2 Answers

Yes, kind of. Use it like this:

version: '2'  services:      wls-admin:         container_name: wls-admin         image: weblogic-domain         build:             context: wls-admin             args:                 - ADMIN_PORT=${WLS_ADMIN_PORT}                 - CLUSTER_NAME=${WLS_CLUSTER_NAME}                 - PRODUCTION_MODE=dev         networks:             - wls-network 

image clause here makes docker-compose build generate docker image named weblogic-domain for this service. This image can be re-used by other services' Dockerfiles, even in the same build process.

like image 75
Kanedias Avatar answered Sep 20 '22 09:09

Kanedias


As per the documentation the build option of a service takes a directory as an argument which contains the famous Dockerfile. There is no way to build a base image and then the actual image of the service.

Docker is a environment in which your application runs. When you are creating a base image, it should have things which are not going to change often. Then you need to build baseiamge once and upload to your repository and use FROM baseimage:latest in the Dockerfile.

For example, if you are building a python application you can create it from python and install requirements:

FROM python:3.6 COPY requirements.txt . RUN pip install -r requirements.txt 

here, python:3.6 is the base image which is not going to change often and thus you need not build it every time you are running docker compose commands.

like image 23
vedarthk Avatar answered Sep 20 '22 09:09

vedarthk