dockerfile 基础镜像 有哪些
发布网友
发布时间:2022-04-28 13:53
我来回答
共1个回答
热心网友
时间:2022-04-11 09:00
当想让一个容器做两件事情,或者使一个Docker镜像包含来自两个不同镜像的依赖库时,就需要知道每个镜像的Dockerfile。本文介绍了如何通过docker history命令来对Docker镜像进行反向工程,得到它们的Dockerfile,并组织到一个Dockerfile里然后build,从而实现想做的事情。
常言道,“不要重复发明轮子!”
在使用Docker时,构建自己的镜像之前,最好在Docker Hub寻找一些可以直接使用的镜像做练习。把软件架构分布到一系列容器中,每一个容器只做一件事情,这样的效果非常好。构建分布式应用的最好的基石是使用来自Docker Hub的官方镜像,因为可以信任它们的质量。
在某些情况下,可能想让一个容器做两件不同的事情。而在另外一些情况下,可能想让一个Docker镜像包含来自两个不同镜像的依赖库。如果有每个镜像的Dockerfile,这是非常简单的。将它们组织到一个Dockerfile里然后build就行。
然而,大多数时间都在使用Docker Hub上准备好的镜像,不会有它们的源Dockerfile。我花时间找一个可以合并(或flatten)两个不同Docker镜像的工具,当然没有它们的Dockerfile。也就是说在找一个能做下面这件事的东西:
image 1 --
\
---> merged_image_12
/
image 2 --
此前在GitHub上有两个相关的讨论(1、2),尽管它们都被关闭了。
这可能吗?
那么,是否存在工具能够像这样做吗:docker merge image2 image2 merged_image?
没有!
你甚至不可以用下面的方式来构建Dockerfile:
FROM image1
FROM image2
简而言之,在一个Dockerfile里不能有多个基础镜像。
但是我需要这个功能!
唯一的解决办法是取得这些镜像的Dockerfile,然后把它们组织到一个文件中,再进行构建。那么,我能在Docker Hub上获得一个镜像的Dockerfile吗? 幸运的是可以。它不能离线获取(译注:原文是online,但显然online时对于来自GitHub的自动构建镜像是可以直接获取的),但是你可以使用docker history命令,通过反向工程获取。
怎么来使用?
在你的机器上使用docker pull从Docker Hub下载镜像。
docker pull image1
docker pull image2
然后使用docker history来取得构建这两个容器时运行的命令。
docker history --no-trunc=true image > image1-dockerfile
docker history --no-trunc=true image2 > image2-dockerfile
接下来打开这两个文件,你可以看到每个镜像的命令堆栈。这是因为Docker镜像通过层(阅读更多)的方式来构建。即你在Dockerfile中键入的每一个命令所构建的新镜像,都是在之前的命令产生的镜像之上。所以你可以对镜像进行逆向工程。
*
不能对镜像进行反向工程的唯一场景,是镜像的维护者在他的Dockerfile中使用了ADD或COPY命令。你会看到这样一行:
ADD file:1ac56373f7983caf22
或 ADD dir:cf6fe659e9d21535844
这是因为不知道维护者在他自己的机器上,包括镜像里使用了什么本地文件。
如何使用Dockerfile创建镜像
首先,创建一个基础的Dockerfile,它包含多个关键指令。FROM指令指定了镜像的基础,如FROM alpine:3.14,后续指令在此基础上进行。VOLUME用于设置数据卷,EXPOSE则声明了容器中公开的端口。一个基本的Dockerfile结构如:FROM > VOLUME > EXPOSE。Dockerfile中的指令,如FROM、RUN、CMD、LABEL、ENV和ARG,每...
altair hyperworks软件介绍
正版Hyperworks软件多少钱,购买正版Hyperworks软件,免费咨询Altair Hyperworks软件中国区网站首页,HyperWorks软件提供了完整的CAE有限元分析解决方案,免费试用和咨询官网。
利用dockerfile 文件执行 docker build 自动构建镜像
Dockerfile是一种脚本文件,通过一系列指令如FROM、RUN、ENV和COPY等,指导Docker守护进程生成镜像。FROM指令指定基础镜像,后续指令在此环境上运行;RUN用于执行shell命令,多个RUN可以合并以提高效率;ENV设置环境变量,会影响容器运行时;COPY用于复制宿主机文件到镜像,ADD则能解包文件。例如,使用FROM nginx...
使用Dockerfile基于1.20镜像搭建Nginx微服务环境
Nginx有许多标签,福哥选择1.20版本。首先拉取镜像,启动临时容器查看内部结构。发现配置文件在/etc/nginx/nginx.conf。使用curl测试,能看到Nginx默认首页。停止、删除临时容器。福哥将设置命令整理至Dockerfile,方便通过Dockerfile安装环境。默认nginx.conf在/etc/nginx/conf.d/下,default.conf内提供Apach...
如何用Dockerfile创建镜像
1.docker大体上按照如下流程执行dockerfile中的指令:docker从基础镜像运行一个容器 执行一条指令,对容器做出修改 执行类似docker commit的操作,提交一个新的镜像层 docker再基于刚提交的镜像运行一个新的容器 执行dockerfile中的下一条指定,直到所有指令都执行完毕。例子:mkdir static_web vim Dockerfi...
怎么创建docker镜像
Dockerfile是创建Docker镜像的核心文件。它包含了一系列指令,用于定义镜像的行为和配置。例如,可以使用FROM指令指定基础镜像,使用RUN指令在镜像中安装软件包,使用COPY指令复制本地文件到镜像中,使用CMD或ENTRYPOINT指令指定容器启动时要执行的命令等。构建镜像 编写完Dockerfile后,需要在Dockerfile所在的目录...
Alpine、Debian、Ubuntu、Centos,谁是最佳选择?
Alpine镜像最小(108MB),其次是Ubuntu(548MB),Debian(124MB),CentOS(231MB)。通常推荐使用Alpine以减小镜像体积。实践建议 在选择基础镜像时,首先在Docker Hub查找官方或合适的镜像,如基于python:3.11.9-alpine3.19构建。根据需要,使用对应的包管理工具在Dockerfile中安装软件包。总结来说,...
请问springboot多模块项目如何打包为1个docker镜像?
首先,在项目根目录下创建Dockerfile文件,用于定义构建步骤和配置。接着,在Dockerfile中指定一个适合的基础镜像,如使用openjdk:11-jdk作为Java应用程序的基础镜像。将编译好的应用程序文件,如可执行jar文件,复制至Docker镜像中。设置镜像中的工作目录为应用程序所在路径,并暴露应用程序监听的端口。定义...
如何查看docker 镜像的dockerfile
1. 选择Debian 官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的。Dockerfile版本通常跟特定的发行版挂钩,正常是使用稳定版(wheezy),有些是测试版(jessie),还有是不稳定版(sid)。Debian镜像的主要好处是文件小,加起来才85.1MB,而Ubuntu要200MB。指定准确的发行版可以预防...
docker镜像由什么组成
Docker镜像由以下几个主要部分组成:1. 镜像基础层(Layers):Docker镜像基于一组基础层创建,这些基础层可以是不同的操作系统或文件系统。2. 文件系统(Filesystem):每个Docker镜像都有一个或多个文件系统,用于存储应用程序代码、配置文件、数据等。3. 标签(Tags):标签是用来标识镜像的特定版本或...
部署:Docker部署自己的C/C++程序
Dockerfile脚本如下:脚本中首先指定了基础镜像,然后在镜像中安装了一些工具,并创建了目录/opt/ls1000。接着将本地文件夹ls1000下的所有文件和目录拷贝到镜像的/opt/ls1000目录下。给自己的程序和库文件添加可执行权限,并将第三方库拷贝到系统目录中,使配置生效。最后,移除安装工具遗留的不必要文件。