当前位置:首页 > docker > dockerfile > 正文内容

dockerfile构建docker镜像

只想摆烂的运维2024-03-28 22:21:20dockerfile

dockerfile介绍

在一些情况下,我们需要自己来构建镜像,而构建镜像一般是通过dockerfile来完成的

dockerfile是一个文本文件,其中包含构建镜像所用的基础镜像及各种指令,应用启动命令

dockerfile组成

名称
说明
示例
FROM基础镜像,一切从这里开始构建

centos:7

alpine:3.18

MAINTAINER镜像是谁写的,姓名+邮箱
RUN

镜像构建的时候需要运行的命令,如果命令有误则会推出dockerfile

RUN yum -y install gcc-c+

RUN 【command】 || echo "error"   表示执行错误只输出"error"不退出

ENV

 构建的时候设置环境遍量
变量有两种设置方式
ENV <key><value>
ENV <key>=<value> ...
第一种是一次设置一个变量,第二种是一次可以设置多个变量

ENV va1 test1
ENV TZ=Asia/Shanghai va1=test1

ADD

将本地文件拷贝到容器中

格式:

本地文件路径可以是文件/目录,也可以是一个url:远程下载文件到容器内;
可以用绝对路径,也可以用相对路径
如果本地文件是一个压缩包,那么复制到镜像中会自动解压

ADD test.sh /opt
ADD /opt/1.txt /opt
ADD 
http://192.168.10.12/file/package.tar.gz /opt
ADD nginx.tar.gz /usr/localhost

COPY 

类似ADD,将本地文件拷贝到镜像中

与ADD不同:
COPY的【本地文件路径】只能是本机路径,不能是远程路径:url
ADD 支持添加远程 url 和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
COPY 支持从其他构建阶段中复制源文件(–from)


WORKDIR 

镜像的工作目录,进入容器时,自动切换的目录路径,可以看作是linux的家目录

WORKDIR /tomcat

VOLUME

挂载数据卷的目录,如果指定了这个配置项,那么指定的目录在创建容器时会自动挂载到数据卷上

VOLUME /var/lib/mysql

EXPOSE

声明暴露的端口,只是告知该镜像中的应用暴露出来的端口,并非设置容器内应用的端口

EXPOSE 8080

CMD

定义容器启动时要执行的命令及参数,可以被覆盖,如果指定了多个CMD,那么只有最后一个会生效,可被替代

CMD ["sbin/nginx", "-g",  "daemon off;"]

CMD ["bash", "-c", "redis/script/redis_start.sh && tail -f redis/log/redis.log"]

ENTRYPOINT 

容器启动时要执行的命令和参数,不可被覆盖,可以追加命令

CMD执行的命令会作为参数传递给ENTRYPOINT 

Entrypoint": ["docker-entrypoint.sh"]

ONBUILD 

当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令



dockerfile执行

命令格式:

docker build -f 【执行的dockerfile】 -t 【构建的docker images 名称】:【镜像TAG】 【构建的上下文位置】

注意:

构建上下文位置:构建过程可以引用上下文中的任何文件,构建可以使用COPY或ADD指令来引用上下文中的文件,通俗来说,就是构建镜像开始的相对路径

"."表示从当前路径开始构建

docker build命令参数

参数
说明
-t指定新镜像的名称及标签信息
-f指定Dockerfile文件的路径和文件名
--build-arg定义构建时传递给Dockerfile的参数
--no-cache在构建过程中不使用缓存
--pull在构建过程中拉取最新的镜像
--compress使用zlib算法对镜像进行压缩
--squash将镜像的历史记录压缩为一个层,减小镜像大小
--target从Dockerfile中指定的某个阶段开始构建镜像


例:执行dockerfile文件doctest来构建镜像,从本机的docfile目录下开始构建,镜像名称testimage,TAG为1.0

docker build -f doctest -t testimage:1.0 docfile/

image.png

docker镜像构建时,会按照dockerfile的内容,依次执行构建命令,"RUN" 中执行的命令有误,那么会退出dockerfile的执行,如果想要忽略错误继续执行,可以指定 "RUN   command || echo error"

dockerfile示例

构建nginx镜像

dockerfile1

FROM centos:7
 
ENV TZ=Asia/Shanghai appv=1.22.1 nginx_dir=/nginx
 
WORKDIR ${nginx_dir}
 
##配置yum源
RUN rm -rf /etc/yum.repos.d/*
ADD http://172.25.230.47:19010/file/system/yum/CentOS-Base.repo /etc/yum.repos.d/
ADD http://172.25.230.47:19010/file/system/yum/epel.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache
 
##下载安装,运行所需插件
RUN yum -y install vim ntpdate ntp net-tools \
wget tree iproute || echo "error"
RUN yum -y install gcc-c++ make
 
ADD nginx-${appv}.tar.gz /nginx
 
##建立nginx用户;进入nginx源码包;解压编译所需依赖包
RUN useradd nginx && cd nginx-${appv} && \
tar xvf pcre-8.45.tar.gz && \
tar xvf openssl-1.1.1b.tar.gz && \
tar xvf zlib-1.2.11.tar.gz
 
##进行nginx编译
RUN cd nginx-${appv} && ./configure \
--prefix=${nginx_dir} \
--sbin-path=${nginx_dir}/sbin/nginx  \
--modules-path=${nginx_dir}/modules \
--conf-path=${nginx_dir}/conf/nginx.conf \
--error-log-path=${nginx_dir}/log/error.log \
--http-log-path=${nginx_dir}/log/access.log  \
--pid-path=${nginx_dir}/nginx.pid  \
--lock-path=$DIR/nginx.lock  \
--http-client-body-temp-path=${nginx_dir}/client_temp \
--http-proxy-temp-path=${nginx_dir}/proxy_temp \
--http-fastcgi-temp-path=${nginx_dir}/fastcgi_temp \
--http-uwsgi-temp-path=${nginx_dir}/uwsgi_temp \
--http-scgi-temp-path=${nginx_dir}/scgi_temp \
--with-compat \
--user=nginx  \
--group=nginx \
--with-openssl=openssl-1.1.1b \
--with-pcre=pcre-8.45/ \
--with-zlib=zlib-1.2.11/ \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module
  
##进行make安装
RUN cd nginx-${appv} && make && make install
RUN mkdir -p ${nginx_dir}/conf/vhosts
 
##复制nginx.conf文件到容器路径下
ADD nginx.conf ${nginx_dir}/conf
 
##标示对外服务端口为18080
EXPOSE 18080
 
##指定nginx运行命令
CMD ["/nginx/sbin/nginx", "-g", "daemon off;"]




dockerfile2

FROM centos:7
 
ENV TZ=Asia/Shanghai appv=1.22.1 nginx_dir=/nginx
 
##提前将nginx编译安装成二进制包,直接将nginx二进制包放到镜像中
ADD docnginx-${appv}.tar.gz /
 
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN useradd nginx
 
WORKDIR ${nginx_dir}
 
EXPOSE 18080
 
CMD ["sbin/nginx", "-g",  "daemon off;"]

image.png

可以发现,第二种方式构建的镜像比第一种方式构建的镜像要小很多,这样不但占用主机磁盘空间少,创建容器,启停也迅速的多


构建tomcat镜像

FROM centos:7
 
ENV TZ=Asia/Shanghai appv=8.5.89 tomcat_dir=/tomcat
 
WORKDIR $tomcat_dir
 
RUN rm -rf /etc/yum.repos/*
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
 
ADD tomcat-${appv}.tar.gz /
RUN useradd tomcat && chmod 600 ${tomcat_dir}/bin/{jmxremote.access,jmxremote.password}
 
CMD ["bin/catalina.sh", "run"]

构建redis镜像

FROM centos:7
 
ENV TZ=Asia/Shanghai appv=6.0.19 redis_dir=/redis
 
WORKDIR $redis_dir
 
ADD redis-${appv}.tar.gz /
 
ADD CentOS-Base.repo /etc/yum.repos.d/
ADD epel.repo /etc/yum.repos.d/
RUN useradd redis && chmod +x redis/script/* && touch redis/log/redis.log
 
EXPOSE 16379
 
CMD ["bash", "-c", "redis/script/redis_start.sh && tail -f redis/log/redis.log"]


轻量级docker镜像

image.png


使用centos或者Ubuntu作为基础镜像进行构建会有一个问题,就是构建后的镜像会很大,这样会过多的占用磁盘空间,不符合docker镜像轻量级的原则。在构建镜像时,镜像越小越好


可以使用alpine作为基础镜像来进行构建,alpine是一个轻量级的linux发行版本,大小只有几MB,适合来构建镜像

docker1.png

扫描二维码推送至手机访问。

版权声明:本文由个人博客发布,如需转载请注明出处。

本文链接:https://opszzfwordpress.club/post/212.html

分享给朋友:
返回列表

没有更早的文章了...

没有最新的文章了...

“dockerfile构建docker镜像” 的相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。