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

posted @ 2022-08-30 14:04  姜翎  阅读(705)  评论(0编辑  收藏  举报