构建基础镜像的 Docker-compose.yml 文件,然后基于它的子镜像? [英] Docker-compose.yml file that builds a base image, then children based on it?

查看:41
本文介绍了构建基础镜像的 Docker-compose.yml 文件,然后基于它的子镜像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为了澄清,当我说基础镜像时,我是指具有所有通用配置的父镜像,因此基于它的子镜像不需要单独下载依赖项.

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.

据我了解,docker-compose.yml 文件是运行时配置,而 Dockerfiles 是构建时配置.但是,有一个使用 docker-compose 的 build 选项,我想知道如何使用它来构建基础映像.

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.

截至目前,我使用一个运行其他 shellscript 的 shellscript.一个从它也创建的基本图像构建我所有的图像.另一个将它们作为具有必要配置的容器运行.但是,基本映像永远不会作为容器运行.

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.

目前,我希望将 shellscript 改成 docker-compose 文件,如下所示:

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

制作图片的shellscript如下:

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

我的问题归结为一件事,我能否在不使用 docker-compose 在容器中运行它的情况下创建此基础映像.(所有 Dockerfile 都以 FROM base:latest 开头,而不是 base 本身).我希望对其他人来说尽可能简单,以便他们只需要运行一个命令.

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.

我使用的是版本 3,根据文档,build: 被忽略,并且 docker-compose 只接受预构建的图像.

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

推荐答案

根据文档,服务的 build 选项将目录作为参数,其中包含著名的 Dockerfile.无法构建基础镜像,然后构建服务的实际镜像.

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 是您的应用程序运行的环境.当你创建一个基础镜像时,它应该有一些不会经常改变的东西.然后您需要构建一次 baseiamge 并上传到您的存储库并在 Dockerfile 中使用 FROM baseimage:latest.

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.

例如,如果您正在构建一个 python 应用程序,您可以从 python 创建它并安装要求:

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

这里,python:3.6基本映像,不会经常更改,因此您无需在每次运行 docker compose 命令时都构建它.

这篇关于构建基础镜像的 Docker-compose.yml 文件,然后基于它的子镜像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆