Docker构建Jira镜像的详细步骤



序言

  • docker镜像制作,学习记录

1. docker镜像制作的常见方法

1.1 docker commit基于已有容器构建镜像(手工)
  • 这种方法将已有容器存为新的镜像,但是不建议使用使用这种方式,原因:

        (1) 手工创建镜像容器出错,效率低且可重复性弱

        (2) 使用者不知道镜像创建过程、里面是否有恶意程序
  • 构建过程

        (1) 运行容器

        (2) 修改容器

        (3) 将容器保存为新的镜像
  • 举例:
docker run -it --name=myContainer myImage /bin/bash		// 新建容器并运行
docker exec -it myContainer /bin/bash					// 进入容器

vim .bashrc报错vim: command not found

apt-get update											// 更新安装源
apt-get install vim										// 安装vim

退出来保存新镜像:使用commit存为新镜像
docker commit -m "install vim" myContainer newImage:newTag

docker images											// 查看新镜像

重新创建容器测试vim已可用
docker history newImage:newTag							// 查看镜像构建历史
1.2 使用Dockerfile自动构建镜像(自动化)
  • docker程序通过读取Dockerfile文件中的指令生成生成镜像
  • Dockerfile的每一行命令都生成了一个镜像层
  • Dockerfile的结构:基础镜像信息 + 维护者信息 + 镜像操作指令 + 容器启动时执行指令

2. Dockerfile镜像构建命令

(1) FROM

  • 功能:指定基础镜像,必须为第一条指令;如果不以任何镜像为基础,FROM scratch
  • 语法
FROM <image>:<tag>	# tag可不指定,默认为latest
  • 注1:tag尽量具体指定,不要用latest,基础镜像更新后不一定是我们想要的
  • 注2:在一个Dockerfile中使用多个基础镜像

       一种是多阶段multi-stage构建:写多个基础镜像入口?构建时指定基于哪个创建

       另一种是整合多个基础镜像的Dockerfile:Dockerfile内没法FROM多个基础镜像
  • 举例
FROM ubuntu:latest	# 基于ubuntu:latest创建镜像

FROM scratch		# 不基于任何镜像创建

(2) RUN

  • 功能:为镜像构建指定要运行的命令行命令,这些命令在docker build时执行
  • 语法
# shell格式(常用)
RUN <command>		# command为终端操作的shell命令,可以是下载或安装软件等

# exec格式
RUN ["executable", "param1", "param2", ...]	# 可理解为可执行文件+参数
  • 注1:每个RUN命令会生成一个镜像层,为了避免镜像臃肿尽量多个命令合到一个指令;不同命令间通过 && 间隔开,换行符 \ 连接换行
  • 举例
RUN     apt-get update && apt-get install -y vim	# 安装vim

(3) CMD

  • 功能:容器启动时执行的命令,这些命令在docker run时执行
  • 语法
# 1、shell格式
CMD <command>

# 2、exec命令格式(常用) 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

# 3、该写法是为ENTRYPOINT指令指定的程序提供默认参数
CMD ["<param1>","<param2>",...]
  • 注1:每个Dockerfile只能有一条CMD命令,如果有多条CMD命令只会执行最后一条
  • 注2:容器启动时如果加了命令行参数会覆盖CMD指定的命令
  • 举例
CMD     /bin/bash	# 启动容器后执行/bin/bash启动shell终端

(4) LABEL

  • 功能:为镜像添加标签,包括创作者、公司、版本等
  • 语法
LABEL <key>=<value> <key>=<value> ...

# e.g.
LABEL maintainer="shuaixio@gmail.com"
LABEL version="1.1"

LABEL maintainer="shuaixio@gmail.com" \
	  version="1.1"
	  
  • 注1:LABEL可以替换MAINTAINER的功能,MAINTAINER已被弃用
  • 注2:LABEL可以继承基础镜像中的LABEL,key相同则会覆盖

(5) ADD

  • 功能:复制命令,把文件复制到镜像中;功能类似COPY,相当于linux中的scp
  • 语法
ADD <src>... <dest>
或
ADD ["<src>",... "<dest>"]
  • 注1:src可以是本地的一个文件、文件夹、压缩包甚至url,如果是url,则ADD相当于wget

        尽量不要把src写成文件夹,会复制整个目录的内容包括系统元数据

        如果是压缩包,拷贝后会自动解压到目标路径
  • 注2:dest路径的填写可以是容器内的绝对路径也可以是相对路径
  • 注3:除非需要从url提取文件或者自动解压文件,否则一律用COPY
  • 举例
ADD xxx.zip /myzipdir/			# 拷贝后自动加压

ADD test1.txt test2.txt /mydir/	# 拷贝多个文件

(6) COPY

  • 功能:复制命令,把文件复制到镜像中
  • 语法
COPY <src>... <dest>

COPY ["<src>",... "<dest>"]
  • 注1:与ADD的区别,COPY只能复制本地文件,其他一样
  • 注2:拷贝多个文件
COPY file_a file_b /root
COPY ["file_a", "file_b", "/root"]

(7) WORKDIR

  • 功能:指定工作目录。该工作目录必须提前创建好,在镜像构建的每一层中都存在,对RUN,CMD,ENTRYPOINT,COPY,ADD生效
  • 语法
WORKDIR /path/to/workdir

# e.g.
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd	# 结果是/a/b/c

(8) ENV

  • 功能:设置环境变量,通过$访问
  • 语法
ENV <key> <value>					# 设置一个
ENV <key1>=<value1> <key2>=<value2>	# 设置多个
  • 举例
ENV CUDA_VERSION=11.1.1		# 设置cuda版本,设置完可通过 ${CUDA_VERSION}来访问

(9) VOLUME

  • 功能:可实现挂在,将本地文件夹或其他容器中文件夹挂在到这个容器中
  • 为什么要挂载

        避免重要数据因容器重启而丢失

        避免容器体积不断扩大
  • 语法
VOLUME <path>
或
VOLUME ["<path1>", "<path2>", ...]
  • 注1:启动容器时可通过docker run -v参数修改挂载点

(10) EXPOSE

  • 功能:暴露容器运行时候的端口给外部
  • 语法
EXPOSE <port1> [<port2> ...]
  • 注1:使用docker run -P时会自动随机映射宿主机与EXPOSE的端口,-p需指定具体端口
  • 举例
EXPOSE 80

# 在docker启动时
docker run -P # 宿主机随机端口映射到docker 80端口

docker run -d -p 80:80 nginx:v4cmd	# -p设置具体的端口映射

(11) ARG

  • 功能:设置镜像构建参数,只在docker build构建镜像的过程中有用
  • 语法
ARG <key>=<value>
  • 注1:镜像构建时使用docker build --build-tag =来指定参数
  • 注2:- -build-tag中的参数名需在Dockerfile中定义,或者Dockerfile中ARG定义参数没有被使用,会报告警
  • 注3:ARG可定义默认值,- -build-tag中进行覆盖

(12) ENTRYPOINT

  • 功能:容器启动时执行的命令,与CMD类似
  • 语法
# 可执行文件+参数
ENTRYPOINT command param1 param2

# shell格式
ENTRYPOINT ["executable", "param1", "param2"]
  • 注1:与CMD命令的差异同

        只能写一条,如果有多条,最后一条生效

        容器启动时运行,而不是镜像构建时运行;
    CMD:docker run时如果加了命令行参数会被覆盖
    ENTRYPOINT:不会被覆盖
  • 注2:如果Dockerfile中同时写了ENTRYPOINT和CMD,并且CMD不是一个完整指令,那么CMD内容将作为ENTRYPOINT的参数(组合使用的方式更常见);如果CMD是一个完整指令,那么会相互覆盖,谁在最后谁生效

(13) ONBUILD

  • 功能:配置当前镜像作为基础镜像时,子镜像执行的命令
  • 语法
ONBUILD [INSTRUCTION]
  • 举例
ONBUILD RUN ls -al

ls -al命令不会在当前镜像中执行,当作为基础镜像时,会在子镜像构建的时候执行ls -al

(14) HEALTHCHECK

  • 功能:容器启动后健康检查命令
  • 语法
# 容器内运行一个命令来检查容器的健康状况
HEALTHCHECK [OPTIONS] CMD command

# 基础镜像中取消健康检查
HEALTHCHECK NONE
  • 注1:命令只能出现一次,如果出现多次只有最后一个生效
  • 注2:HEALTHCHECK支持的选项

        - -interval=<间隔>:两次健康检查的间隔,默认为 30 秒;

        - -timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;

        - -retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次
  • CMD后命令的返回值决定了本次健康检查是否成功,具体返回值如下

        0: success - 表示容器是健康的

        1: unhealthy - 表示容器已经不能工作了

        2: reserved - 保留,不要使用该值
  • 注2:HEALTHCHECK的状态可以通过 docker container ls查看,健康检查的结果可以通过docker inspect来查看

2. Dockerfile自动构建镜像实例

2.1 Dockerfile镜像构建实例


# This dockerfile uses the alpine image
# VERSION 1.0
# Author: shuaixio

# base image
FROM	nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu18.04

# label info
LABEL	maintainer="shuaixio@email.com" version="1.0"

# apt-get: install necessary softwares
RUN	apt-get update && apt-get install -y vim wget libxml2 gcc g++ libeigen3-dev pkg-config sqlite3 libsqlite3-dev git autoconf automake libtool unzip libboost-dev && cd ~/

# wget: install cmake3.20.0
RUN	wget http://www.cmake.org/files/v3.20/cmake-3.20.0.tar.gz && tar xf cmake-3.20.0.tar.gz && cd cmake-3.20.0 && ./configure && make -j8 && make install && cd ~/

# git clone: install geographiclib
RUN	git clone https://github.com/sotex/geographiclib.git && cd geographiclib && mkdir build && cd build && cmake .. && make -j8 && make install && cd ~

# set expose port
EXPOSE	22 80

# /bin/bash after run container
CMD	/bin/bash
2.2 镜像构建命令
  • 通过docker build基于Dockerfile构建镜像
docker build -t imageName:Tag .
  • 注1:.表示当前目录,代表从本目录的Dockerfile执行;也可以写成绝对路径

        由于构建镜像可能有复制该目录下数据的操作,所以不要直接在根目录下进行构建
  • 注2:tag自己写,如果和之前镜像重复则会覆盖之前镜像
2.3 查看和保存镜像构建历史
  • 使用docker history命令能清楚的看到每一层进行的操作,方便使用者review
docker history imageId
  • 另外 docker history image 可以看到每一层的大小
  • docker history命令还可以用来保存镜像的dockerfile操作过程
docker history --no-trunc=true imageId > image_dockerfile


参考文章: docker dockerfile详解 Dockerfile实战 docker-hub官网



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空