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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With