场景
- 在实际业务场景中,需要制作多个不同版本进行镜像使用,如maven版本、jdk、openjdk不同使用等,所以需要做多个针对不同版本做不同的镜像。
- 这里记录一下之前devops用的openjdk版本、某些部门需要用orcle jdk、特此需要做不同的镜像,镜像内包含centos、maven、jdk。
镜像制作
基础镜像
- 基础镜像拉去,如centos、alpine等
docker pull centos:7
jdk、maven
- 拉取centos基础镜像,把jdk、maven镜像制作进基础镜像中,在使用centos:7作为基础镜像,配置jdk版本及maven版本,当拉取镜像时可以直接使用,在devops使用过程中,可以直接run进行启动使用。
- dockerfile
from centos:7
maintainer rundreams@yeah.net
workdir /usr/bin/jdk
workdir /usr/bin/mvn
copy apache-maven-3.8.6 /usr/bin/mvn
copy jdk1.8.0_202 /usr/bin/jdk
env lang=c.utf-8
env java_home=/usr/bin/jdk
env classpath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar
env maven_home=/usr/bin/mvn
env path=$java_home/bin:$maven_home/bin:$path
- 然后下载maven、jdk版本在dockerfile同级目录下,并配置maven配置文件信息,如拉取仓库地址等
- 在同级目录存在文件夹 apache-maven-3.8.6、jdk1.8.0_202
- 基于进行可以根据要求选择,如果还有其他命令执行或者需要加入某些环境变量配置,可以参考后面的命令解析
构建镜像
docker build -f dockerfile -t 镜像地址:版本 .

推送远程
docker push 镜像地址:版本
命令解析
from
格式:
from <image>
from <image>:<tag>
from <image>@<digest>
示例:
from centos:7
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
run
run用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:
run <command>
exec执行
格式:
run ["executable", "param1", "param2"]
示例:
run apk update
run ["/etc/execfile", "arg1", "arg1"]
注:run指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
add
- 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
add <src>... <dest>
add ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
add hom* /mydir/
add hom?.txt /mydir/
add test relativedir/
add test /absolutedir/
copy
- 类似add,但是是不会自动解压文件,也不能访问网络资源
cmd
格式:
cmd ["executable","param1","param2"] (执行可执行文件,优先)
cmd ["param1","param2"] (设置了entrypoint,则直接调用entrypoint添加参数)
cmd command param1 param2 (执行shell内部命令)
示例:
cmd echo "this is a test." | wc -l
cmd ["/usr/bin/wc","--help"]
注:cmd不同于run,cmd用于指定在容器启动时所要执行的命令,而run用于指定镜像构建时所要执行的命令。
entrypoint
格式:
entrypoint ["executable", "param1", "param2"] (可执行文件, 优先)
entrypoint command param1 param2 (shell内部命令)
示例:
from centos:7
entrypoint ["ls", "/usr/local"]
cmd ["/usr/local/tomcat"]
之后,docker run 传递的参数,都会先覆盖cmd,然后由cmd 传递给entrypoint ,做到灵活应用
注:
entrypoint与cmd非常类似,不同的是通过docker run执行的命令不会覆盖entrypoint,
而docker run命令中指定的任何参数,都会被当做参数再次传递给cmd。
dockerfile中只允许有一个entrypoint命令,多指定时会覆盖前面的设置,
而只执行最后的entrypoint指令。
通常情况下, entrypoint 与cmd一起使用,entrypoint 写默认命令,当需要参数时候 使用cmd传参
label
格式:
label <key>=<value> <key>=<value> <key>=<value> ...
示例:
label version="1.0" description="ssd硬盘" by="rundreamsfly"
注:
使用label指定元数据时,一条label指定可以指定一或多条元数据,指定多条元数据时不同元数据
之间通过空格分隔。推荐将所有的元数据通过一条label指令指定,以免生成过多的中间镜像。
env
格式:
env <key> <value>
env <key>=<value> ...
如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
env myname iversion
env mycat=demos
expose
格式:
expose <port> [<port>...]
示例:
expose 80 443
expose 8080
expose 11211/tcp 11214/udp
注:
expose并不会让容器的端口访问到主机。要使其可访问,
需要在docker run运行容器时通过-p来发布这些端口,或通过-p参数来发布expose导出的所有端口
如果没有暴露端口,后期也可以通过-p 8080:80方式映射端口,但是不能通过-p形式映射
volume
格式:
volume ["/path/to/to"]
示例:
volume ["/data"]
volume ["/var/www", "/var/log/apache2", "/etc/apache/user"
注:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
卷可以容器间共享和重用
容器并不一定要和其它容器共享卷
修改卷后会立即生效
对卷的修改不会对镜像产生影响
卷会一直存在,直到没有任何容器在使用它
workdir
格式:
workdir /path/to/workdir
示例:
workdir /a (这时工作目录为/a)
workdir b (这时工作目录为/a/b)
workdir c (这时工作目录为/a/b/c)
注:
通过workdir设置工作目录后,dockerfile中其后的命令run、cmd、entrypoint、add、copy
等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
arg
格式:
arg <name>[=<default value>]
示例:
arg site
arg build_user=www
from centos:7
arg parameter
volume /usr/share/nginx
run yum -y install $parameter
expose 80 443
cmd nginx -g "daemon off;"
docker build --build-arg=parameter=net-tools -t nginx:1.14 .
一图汇总

其他信息
源码编译制作nginx镜像
from centos
maintainer bertwu
env path /usr/local/nginx/sbin:$path
add nginx-1.8.0.tar.gz /usr/local/
add epel-release-latest-7.noarch.rpm /usr/local/
run rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
run yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
run useradd -s /sbin/nologin -m www
workdir /usr/local/nginx-1.8.0
run ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
run echo "daemon off;" >> /etc/nginx.conf
expose 80
cmd ["nginx"]
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论