1、首先我们来谈一下,Dockerfile编写的大概步骤。
1) 手动编写Dockerfile的文件(注意就一个Dockerfile的文件没有后缀名),当然要满足Dockerfile的编写规范
2) 编写好这个文件之后,直接使用docker build命令执行,获得一个自定义镜像
3) docker run 运行定义好的docker镜像
我们再来谈一下什么是Dockerfile?
Dockerfile 就是用来构建Docker镜像的镜像文件,是由一系列命令和参数构成的脚本。
我们可以去docker的官方镜像中心查看相关镜像,如,查看centos镜像,如图:
点击查看Dockerfile ,如图:
发现它的基础镜像是FROM scratch ,那什么是scratch?
scratch是所有镜像的基础镜像(元镜像),相当于java中的Object
2、Dockerfile的基础内容:
1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2)指令按照从上到下,顺序执行
3)#表示注释
4)每条指令都会创建一个新的镜像层,并对镜像进行提交
3、Doackerfile执行的流程:
1)docker从基础镜像运行一个容器
2)执行一条指令并对容器作出修改
3)执行类似docker commit的操作提交一个新的镜像层
4)执行dockerfile中的下一条指令直到所有指令都执行完成
4、Dockerfile中的保留字指令:
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的名称和邮箱
RUN 容器运行时需要执行的命令
EXPOSE 当前容器对外暴露出的端口号
WORKDIR 指定在创建容器后,终端默认登录的进来工作的目录,一个落脚点
ENV 用来构建镜像中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。如:COPY src dest COPY ["src" , "dest""]
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令。Dockerfile 中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
FROM python:3.11.4
MAINTAINER haijin # 镜像作者信息
WORKDIR /app
# 工作目录,这个目录对应于镜像内的工作目录,后面的所有涉及到路径的操作都可以
# 使用WORKDIR的相对路径来指定
COPY requirements.txt requirements.txt
# 拷贝requirements.txt 到 镜像中/app/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装pip包
COPY . .
# 将当前文件中的目录复制到/app目录下
ENV FLASK_APP app
# 设置环境变量,让flask run 命令能够找到启动文件的位置
EXPOSE 8386
ENTRYPOINT ["python"]
CMD ["app.py"]
# 执行启动命名 flask run -h 0.0.0.0 -p 8386 列表中的每个元素之间代表空格