podman用脚本和dockerfile做apache编译安装镜像
基本结构
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时默认要执行的指令
指令
指令 | 描述 |
---|---|
FROM | 指定构建新lmage时使用的基础lmage,通常必须是Dockerfile的第一个有效指令,但其前面也可以出现ARG指令 |
LABEL | 附加到Image之上的元数据,键值格式;一般后面加MAINTAINER 用来描述作者信息 |
ENV | 以键值格式设定环境变量,可被其后的指令所调用,且基于新生成的Ilmage运行的Container中也会存在这些变量 |
ARG | 定义专用于build过程中的变量,但仅对该指标之后的调用生效,其值可由命令行选项" --build-arg"进行传递 |
RUN | 以FROM中定义的lmage为基础环境运行指定命令,生成结果将作为新Image的一个镜像层,并可由后续指令所使用 |
CMD | 基于该Dockerfile生成的lmage运行Container时,CMD能够指定容器中默认运行的程序,因而其只应该定义一次 |
ENTRYPONT | 类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时CMD的内容将作为该指令中定义的程序的参数 |
WORKDIR | 为RUN、CMD、ENTRPOINT、COPY和ADD等指令设定工作目录 |
COPY | 复制主机上或者前一阶段构建结果中(需要使用–from选项)文件或目录生成新的镜像层 |
ADD | 与COPY指令的功能相似,但ADD额外也支持使用URL指定的资源作为源文件 |
VOLUME | 指定基于新生成的Image运行Container时期望作为Volume使用的目录 |
EXPOSE | 指定基于新生成的Image运行Container时期望暴露的端口,但实际暴露与否取决于"docket run"命令的选项,支持TCP和UDP协议 |
USER | 为Dockerfile中该指令后面的RUN、CMD和ENTRYPOING指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID |
ONBUILD | 触发器,生效于由该Dockerfile构建出的新lmage被用于另一个Dockerfile中的FROM指令作为基础镜像时 |
FROM
格式为FROM
或FROM :
。
第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。
示例
#语法:
FROM <镜像名称>
LABEL MAINTAINER
指定维护者信息
#语法:
LABEL MAINTAINER "[作者] [邮箱]"
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量
#语法:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
#语法:
ARG <参数名>[=<默认值>]
RUN
用于执行后面跟着的命令行命令。有以下俩种格式:
shell格式
#语法:
RUN <命令行的命令>
RUN ["/bin/bash","-c","echo hello"]
exec格式
#语法:
RUN ["可执行文件", "参数1", "参数2"]
RUN echo "hello world\nhello tom" > /tmp/abc && \
cat /tmp/abc
CMD
- CMD 在docker run 时运行。
- RUN 是在 docker build。
- 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
#语法:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPONT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
#语法:
ENTRYPOINT <shell 命令>
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
WORKDIR
WORKDIR : 指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
#语法:
WORKDIR <工作目录路径>
COPY
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
#语法:
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
ADD
ADD :ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>;并且源文件目录可以是URL
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
#语法:
ADD <src> <dest>
VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
语法:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE
EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用
#语法:
EXPOSE 端口号
USER
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
#语法:
USER <用户名>[:<用户组>]
ONBUILD
配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
#语法:
ONBUILD <其它指令>
podman用dockerfile做apache编译安装镜像
创建目录并下载所需安装包
[root@localhost ~]# mkdir apache
[root@localhost ~]# cd apache/
[root@localhost apache]# mkdir files
[root@localhost apache]# touch Dockerfile
[root@localhost apache]# ls
Dockerfile files
[root@localhost apache]# cd files/
[root@localhost files]# wget http://mirrors.aliyun.com/apache/apr/apr-1.7.0.tar.gz
[root@localhost files]# wget https://mirrors.aliyun.com/apache/apr/apr-util-1.6.1.tar.gz
[root@localhost files]# wget https://mirrors.aliyun.com/apache/httpd/httpd-2.4.54.tar.gz
[root@localhost files]# ls
apr-1.7.0.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.54.tar.gz
编写entrypoint.sh脚本
[root@localhost files]# vim entrypoint.sh
[root@localhost files]# cat entrypoint.sh
#!/bin/bash
sed -i '/^ServerName/s/#//g' /usr/local/apache/conf/httpd/conf
exec "$@"
[root@localhost files]# chmod +x entrypoint.sh
[root@localhost files]# ll
总用量 11136
-rw-r--r--. 1 root root 1093896 4月 5 2019 apr-1.7.0.tar.gz
-rw-r--r--. 1 root root 554301 10月 23 2017 apr-util-1.6.1.tar.gz
-rwxr-xr-x. 1 root root 87 8月 30 21:23 entrypoint.sh
-rw-r--r--. 1 root root 9743277 6月 8 16:42 httpd-2.4.54.tar.gz
编写dockerfile
[root@localhost files]# cd ..
[root@localhost apache]# vim Dockerfile
[root@localhost apache]# cat Dockerfile
FROM centos
LABEL MANTAINER "JL 1548126326@qq.com"
ENV apr_version=1.7.0 apr_util_version=1.6.1 httpd_version=2.4.54
ADD files/* /usr/src/
ADD files/entrypoint.sh /
RUN rm -rf /etc/yum.repos.d/* && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
yum -y install make gcc gcc-c++ openssl-devel pcre-devel expat-devel libtool libxml2-devel && \
useradd -r -M -s /sbin/nologin apache && \
cd /usr/src/apr-${apr_version} && \
sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && make && make install && \
cd /usr/src/apr-util-${apr_util_version} && \
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
make && make install && \
cd /usr/src/httpd-${httpd_version} && \
./configure --prefix=/usr/local/apache \
--sysconfdir=/etc/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork && make && make install && \
yum clean all && \
yum -y remove gcc gcc-c++ make && \
rm -rf /tmp/* /usr/src/*
WORKDIR /usr/local/apache
EXPOSE 80
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
ENTRYPOINT ["/bin/bash","/entrypoint.sh"]
创建镜像
[root@localhost apache]# cd
[root@localhost ~]# podman build -t feigeaq/httpd:v1 apache/
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/feigeaq/httpd v1 07895cb20b1b 19 seconds ago 417 MB
quay.io/centos/centos latest 300e315adb2f 21 months ago 217 MB
创建容器并测试
[root@localhost ~]# podman run -d -p 80:80 feigeaq/httpd:v1
17b9e45a25c6236d27a459c2ee1399c0ea2b8bbb375a9afd3c8d6eee2a008516
[root@localhost ~]# curl localhost:80
<html><body><h1>It works!</h1></body></html>
上传镜像到dockerhub
[root@localhost ~]# podman login docker.io
Username: feigeaq
Password:
Login Succeeded!
[root@localhost ~]# podman push feigeaq/httpd:v1
Getting image source signatures
Copying blob ad5e728c2dc7 done
Copying blob ac2d99595bc1 done
Copying blob d3aefe33dc33 done
Copying blob 2653d992f4ef done
Copying config 07895cb20b done
Writing manifest to image destination
Storing signatures
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)