dockerfile

基础结构

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:

  • 基础镜像信息
  • 维护者信息
  • 镜像操作指令
  • 容器启动时默认要执行的指令

第一行必须指定基于的基础镜像
FROM centos
维护者信息
LABEL MANTAINER "marui123 3215547886@qq.com"
镜像操作指令
RUN useradd -r -M -s /sbin/nologin apache
容器启动时默认要执行的指令
CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]

其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。最后是CMD指令来指定运行容器时的操作指令。

指令

指令的一般格式为INSTRUCTION arguments,指令包括:

  • FROM
  • LABEL MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

from

格式为FROM 或FROM :。
第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。

FROM
FROM

FROM :

FROM :

label maintainer

格式为LABEL MAINTAINER ,指定维护者信息

LABEL MAINTAINER "[作者] [邮箱]"
LABEL MANTAINER "marui123 3215547886@qq.com"

run

格式为RUN 或RUN [“executable”,”param1″,”param2″]。前者将在shell终端中运行命令,即/bin/sh -c;后者则使用exec执行。指定使用其他终端可以通过第二种方式实现


RUN RUN ["/bin/bash","-c","echo hello"]
[root@localhost ~]# cd httpd/
[root@localhost httpd]# ls
Dockerfile  files
[root@localhost httpd]# vim Dockerfile
FROM busybox

LABEL MANTAINER "marui123 3215547886@qq.com"

RUN echo "abcdefg" > /tmp/abc
[root@localhost httpd]#  podman build -t httpd:1.0 .

[root@localhost httpd]# podman run -it --rm httpd:1.0 /bin/sh
/ # cd /tmp/
/tmp # ls
abc

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行


RUN ["可执行文件", "参数1", "参数2"]RUN echo "hello world\nhello tom" > /tmp/abc && \
    cat /tmp/abc

cmd

CMD支持三种格式:

  • CMD [“executable”,”param1″,”param2″]使用exec执行,推荐方式
  • CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用
  • CMD [“param1″,”param2”]提供给ENTRYPOINT的默认参数

CMD用于指定启动容器时默认要执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。

CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
CMD  CMD ["","","",...] CMD ["","",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

export

格式为EXPOSE […]。
例如:EXPOSE 22 80 8443

EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用。

在启动容器时通过-P,Docker主机会自动分配一个端口转发到指定的端口;

使用-p则可以具体指定哪个本地端口映射过来。


EXPOSE 端口号

env

格式为ENV 。指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持。

ENV PATH /usr/local/apache/bin:$PATH   //配置环境变量
ENV
ENV = =...

add

格式为ADD 。
该命令将复制指定的到容器中的。其中可以是Dockerfile所在目录的一个相对路径(文件或目录);也可以是一个URL;还可以是一个tar文件(会自动解压为目录)。

ADD
[root@localhost httpd]# ls
Dockerfile  files
[root@localhost httpd]# ls files/
apr-1.7.0.tar.gz  apr-util-1.6.1.tar.gz  entrypoint.sh  httpd-2.4.54.tar.gz
[root@localhost httpd]# vim Dockerfile
FROM busybox

ADD files/apr-1.7.0.tar.gz /tmp/
[root@localhost httpd]#  podman build -t httpd:2.0 .
[root@localhost httpd]#  podman run -it --rm  httpd:2.0 /bin/sh
/ # cd tmp/
/tmp # ls
apr-1.7.0
/tmp #

copy

格式为COPY 。
复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时会自动创建。
当使用本地目录为源目录时,推荐使用COPY。

格式为COPY  。

复制本地主机的(为Dockerfile所在目录的相对路径,文件或目录)为容器中的。目标路径不存在时会自动创建。
当使用本地目录为源目录时,推荐使用COPY。

entrypoint

ENTRYPOINT有两种格式:

  • ENTRYPOINT [“executable”,”param1″,”param2″]
  • ENTRYPOINT command param1 param2(在shell中执行)

配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。

每个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。


ENTRYPOINT ENTRYPOINT ["","","",...]

volume

格式为VOLUME [“/data”]。
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。


VOLUME ["", ""...]VOLUME

user

格式为USER daemon。
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用gosu,而不推荐sudo。如果不指定,容器默认是root运行。


USER [:]

workdir

格式为WORKDIR /path/to/workdir。
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。


WORKDIR

onbuild

配置当所创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。


ONBUILD

此时,如果基于image-A创建新的镜像时,新的Dockerfile中使用FROM image-A指定基础镜像时,会自动执行ONBUILD指令的内容,等价于在后面添加了两条指令。

使用ONBUILD指令的镜像,推荐在标签中注明

创建镜像

编写完成Dockerfile后,可以通过docker build命令来创建镜像。
基本的格式为docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项。

  • 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 https://downloads.apache.org/apr/apr-1.7.0.tar.gz https://downloads.apache.org/apr/apr-util-1.6.1.tar.gz https://downloads.apache.org/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

[root@localhost files]# vim 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 httpd]# vim Dockerfile
FROM centos

LABEL MANTAINER "marui123 3215547886@qq.com"

ENV apache_version 2.4.54
ENV PATH /usr/local/apache/bin:$PATH

ADD files/apr-1.7.0.tar.gz /usr/src/
ADD files/apr-util-1.6.1.tar.gz /usr/src/
ADD files/httpd-${apache_version}.tar.gz /usr/src/
ADD files/entrypoint.sh /

RUN useradd -r -M -s /sbin/nologin apache && \
cd /etc/yum.repos.d && rm -r * && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo && \
yum clean all && yum makecache && \
yum -y install gcc gcc-c++ make openssl-devel pcre-devel expat-devel libtool && \
cd /usr/src/apr-1.7.0 && \ sed -i '/$RM "$cfgfile"/d' configure && \
./configure --prefix=/usr/local/apr && \ make && make install && \
cd ../apr-util-1.6.1 && \ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && \
make && make install && \
cd ../httpd-${apache_version} && \
./configure --prefix=/usr/local/apache \
--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/*

 EXPOSE 80
 WORKDIR /usr/local/apache
 CMD ["/usr/local/apache/bin/httpd","-D","FOREGROUND"]
 ENTRYPOINT ["/bin/bash","/entrypoint.sh"]

[root@localhost httpd]# podman build -t httpd:v6.66 .
[root@mr ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED            SIZE
docker.io/marui123/httpd  v6.66       69bb2bcc3538  About an hour ago  427 MB
localhost/httpd           v6.66       69bb2bcc3538  About an hour ago  427 MB
docker.io/library/httpd   latest      a981c8992512  7 days ago         149 MB
docker.io/library/centos  latest      5d0da3dc9764  11 months ago      239 MB

[root@localhost httpd]# podman run -d httpd:v6.66
[root@mr ~]# podman ps
CONTAINER ID  IMAGE                            COMMAND               CREATED            STATUS                PORTS                  NAMES
b1bc3da5e13d  localhost/httpd:v6.66            /usr/local/apache...  44 minutes ago     Up 44 minutes ago                            funny_sanderson

[root@localhost httpd]# podman inspect -l |grep -i ipaddr
"IPAddress": "10.88.0.6", "IPAddress": "10.88.0.6", [root@localhost httpd]# curl 10.88.0.6 //访问成功 It works!

[root@mr ~]# podman inspect -l |grep -i ipaddr
               "IPAddress": "10.88.0.10",
                         "IPAddress": "10.88.0.10",
[root@mr ~]# curl 10.88.0.10
It works!

[root@mr ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED            SIZE
docker.io/marui123/httpd  v6.66       69bb2bcc3538  About an hour ago  427 MB
localhost/httpd           v6.66
docker.io/library/docker  latest      0dfb722b2a54  3 days ago         135 MB
docker.io/library/httpd   latest      a981c8992512  7 days ago         149 MB
docker.io/library/centos  latest      5d0da3dc9764  11 months ago      239 MB

[root@localhost httpd]# podman tag httpd:v6.66 docker.io/marui123/httpd:v6.66
 [root@localhost httpd]# podman login docker.io
 Username: marui123
 Password: Login Succeeded! [root@localhost httpd]# podman push docker.io/marui123/httpd:v6.66
 Getting image source signatures
Copying blob 74ddd0ec08fa skipped: already exists
Copying blob 87fc485808f9 skipped: already exists
Copying blob 96a9e2e4d6c9 skipped: already exists
Copying blob 5f6db79d3d08 skipped: already exists
Copying blob 231da1b56346 skipped: already exists
Copying blob e97783ef0259 skipped: already exists
Copying config 69bb2bcc35 done
Writing manifest to image destination
Storing signatures

dockerfile
[root@mr containers]# podman run -d --name marui123 -P docker.io/marui123/httpd:v6.66
cd89aa7da015c89d7cf07647372ee72a71516f7c9446e07d2ff311d199dbdbec
[root@mr containers]# podman ps -a
CONTAINER ID  IMAGE                            COMMAND               CREATED         STATUS             PORTS                  NAMES
bbef59562810  docker.io/library/httpd:latest   httpd-foreground      3 hours ago     Up 3 hours ago                            web
339b5ca8079e  docker.io/library/centos:latest  /bin/bash             3 hours ago     Up 3 hours ago                            jovial_chaplygin
bae49df78a61  localhost/httpd:v2.2             /usr/local/apache...  59 minutes ago  Up 59 minutes ago                         funny_keldysh
b1bc3da5e13d  localhost/httpd:v6.66            /usr/local/apache...  16 minutes ago  Up 16 minutes ago                         funny_sanderson
cd89aa7da015  docker.io/marui123/httpd:v6.66   /usr/local/apache...  21 seconds ago  Up 21 seconds ago  0.0.0.0:38349->80/tcp  marui123

Original: https://www.cnblogs.com/marymary/p/16641584.html
Author: 溜溜威
Title: dockerfile

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581533/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • typedef

    为类型定义别名 typedef int Int 这样 Int 就是 int类型的别名,就可以使用 Int来定一整形变量. 只需要在类型变量生命的基础上,再加一个关键字 typede…

    Linux 2023年6月13日
    095
  • Xbox分辨率突然变成640p

    今天XBox突然抽风还是发什么神经,输出分辨率突然变得非常模糊。一开始以为是HDMI线出现问题,后来用一条新的也是一样,所以就怀疑系统出了什么幺蛾子。 进入【电视和显示选项】——【…

    Linux 2023年6月13日
    0138
  • jmeter 函数之 _RandomString

    jmeter中有许多函数,学会函数的灵活使用,对于很多工作都是事半功倍的效果,今天先学习函数——__RandomString,该函数可以自定义字符长度。做接口自动化测试时,可以使用…

    Linux 2023年6月8日
    0129
  • 使用7z程序CLI实现基础功能

    阅文时长 | 0.64分钟字数统计 | 1025.6字符主要内容 | 1、引言&背景 2、压缩 3、解压 4、更多命令可见 5、声明与参考资料『使用7z程序CLI实现基础功…

    Linux 2023年6月14日
    097
  • MySQL双主同步的实现

    双主复制: 在两个节点上都可以写入数据,互为主从节点。 解决单点失败的问题:一个主节点失败,所有节点都会失败。 双主配置: (1) 各节点使用一个惟一server_id (2) 都…

    Linux 2023年6月7日
    099
  • 【Linux】CMake源码编译安装教程

    步骤: 卸载旧版本 官网下载安装包 CMake源码编译安装 检查是否安装成功 Linux下,默认安装方式: sudo apt install cmake 如果使用默认的安装方式,这…

    Linux 2023年6月13日
    0110
  • MSSQL中游标的语法结构

    | 0.21分钟 | 342.4字符 | 1、引言&背景 2、开箱即用的游标结构 3、声明与参考资料 | SCscHero | 2022/4/30 PM10:3 | 系列 …

    Linux 2023年6月14日
    095
  • Linux系统卡死后紧急处理

    前言:Linux系统卡死了的情况有很多,最常见的是系统负载过高导致的。还可以运行内存耗用极大的程序(如虚拟机),也会迅速提升系统负载。注意:不能再试图依赖任何图形界面的东西,如 G…

    Linux 2023年6月7日
    0110
  • 软件工程 软件测试 第6篇随笔

    5、软件测试 1.软件测试的目的: 测试是一个为了发现错误而执行程序的过程 一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试用例 一个成功的测试是指揭示了迄今为止尚未发现…

    Linux 2023年6月7日
    0126
  • /dev/null文件的作用以及使用方法

    关于/dev/null,以及如何使用它 今天在看MIT的一个课程时,老师给的程序实例中有一个地方没弄明白: #!/bin/bash echo "Starting prog…

    Linux 2023年6月6日
    0112
  • Linux命令(实时更新)

    本博客主要总结一下博主工作中比较常用的命令: 1.iconv命令 对于给定文件把它的内容从一种编码转换成另一种编码。 -f encoding : 把字符从encoding编码开始转…

    Linux 2023年6月6日
    092
  • .NET 6上的WebView2体验

    上次说为了不想在web端登录博客园,我想着还是继续使用 MarkWord编写博客,不过在使用的过程中,如果markdown文件的目录中有中文的话,Markdown预览就不能够显示粘…

    Linux 2023年6月6日
    0121
  • bash 教程-1 shell 基础 快捷键 目录堆栈 操作历史 [MD]

    我的GitHub 我的博客 我的微信 我的邮箱 bqt20094 baiqiantao@sina.com Bash 简介 Bash 是 Unix 系统和 Linux 系统的一种 S…

    Linux 2023年5月28日
    0103
  • Scipy

    1.Scipy简介 使用python做科学计算,详情参考官方文档 scipy软件包包含专用于科学计算中常见问题的各种工具箱,他的不同子模块对应于不同的应用程序,例如插值,积分,优化…

    Linux 2023年6月6日
    089
  • 04-MySQL锁

    数据库锁 1、SQL语言包括那几个部分 SQL语言包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL)和数据查询(DQL)四个部分 2、每部分都有哪些操作关键词 数据定…

    Linux 2023年6月7日
    0151
  • Grafana+Prometheus 搭建 JuiceFS 可视化监控系统

    作为承载海量数据存储的分布式文件系统,用户通常需要直观地了解整个系统的容量、文件数量、CPU 负载、磁盘 IO、缓存等指标的变化。 JuiceFS 没有重复造轮子,而是通过 Pro…

    Linux 2023年6月14日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球