dockerfile文件详解

dockerfile

Dockerfile是一种用于构建Docker镜像的文件,它包含一系列的指令,用于描述如何构建镜像。

dockerfile示例

指定基础镜像

FROM harbor.zhianoa.com/phoenix/ubuntu-python:3.7

镜像中创建/app目录,这一步可提前在基础镜像中创建好

RUN mkdir /app

拷贝当前目录下的指定文件到镜像中的/app目录

COPY requirements.txt /app

设置工作目录

WORKDIR /app

安装Python依赖

RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

拷贝当前目录下所有文件(代码)到镜像中的/app目录

COPY . /app

给/app目录下以run_开头的文件设置可执行权限

RUN /bin/chmod 777 run_*

镜像的分层设计

Dockerfile的指令每执行一条就会在镜像上新建一层。所以指令越多,层数越多,镜像越大。

例如:

FROM ubuntu:latest

RUN apt-get update

RUN apt-get install -y python3 python3-pip

RUN pip3 install -r requirements.txt

以上执行会创建 3 层镜像。可简化为以下格式:

FROM ubuntu:latest

RUN apt-get update \

&& apt-get install -y python3 python3-pip \

&& pip3 install -r requirements.txt

如上,以 && 符号连接命令,这样执行后,只会创建一层镜像。

指令

FROM

指定基础镜像,用于后续的指令构建。

MAINTAINER

指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)

LABEL

添加镜像的元数据,使用键值对的形式。

RUN

在构建过程中在镜像中执行命令。

EXPOSE

声明容器运行时监听的特定网络端口。

ENV

在容器内部设置环境变量。

VOLUME

为容器创建挂载点或声明卷。

WORKDIR

设置后续指令的工作目录。

USER

指定后续指令的用户和用户组。

ADD

将宿主机上的文件/目录/远程URL拷贝到镜像中。

例如:ADD http://example.com/foobar /app

格式:

ADD <源路径1>... <目标路径>

ADD "\<源路径1\>",... "\<目标路径\>"

COPY

将宿主机上的文件/目录复制到镜像中。

同ADD,区别是ADD可以是URL,COPY只能是本地文件。

格式:

COPY --chown=\:\ <源路径1>... <目标路径>

COPY --chown=\:\ "\<源路径1\>",... "\<目标路径\>"

<目标路径>:容器内的指定路径,路径不存在则自动创建。

CMD

指定容器创建时(运行时)的默认命令。(可以被覆盖)

为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:

CMD <shell 命令>

CMD "\<可执行文件或命令\>","\","\",...

CMD "\","\",... # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

设置容器创建时(运行时)的主要命令。(不可被覆盖)

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖。

如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:

ENTRYPOINT "\","\","\",...

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:

FROM nginx

ENTRYPOINT "nginx", "-c" # 定参

CMD "/etc/nginx/nginx.conf" # 变参

1、不传参运行

$ docker run nginx:test

容器内会默认运行以下命令,启动主进程。

nginx -c /etc/nginx/nginx.conf

2、传参运行

$ docker run nginx:test -c /etc/nginx/new.conf

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)

nginx -c /etc/nginx/new.conf

RUN和CMD的区别

CMD 在docker run 时运行。

RUN 在docker build 时运行。

相关推荐
初级炼丹师(爱说实话版)2 小时前
Ubuntu服务器配置docker
服务器·ubuntu·docker
生活爱好者!3 小时前
NAS还能用来开视频会议?docker一键部署MiroTalk SFU
运维·docker·容器
兵bing5 小时前
Docker Compose 进阶配置与最佳实践笔记
docker
是良辰5 小时前
Docker Nginx HTTPS 自签证书部署完整操作文档
nginx·docker·https
瞬间&永恒~6 小时前
【Docker】(四)Namespace 详解
运维·docker·容器
就改了6 小时前
Docker安装并运行Redis
redis·docker·容器
yagami_gagami8 小时前
第四届黄河流域公安院校电子物证个人赛服务器取证
linux·服务器·网络·mysql·安全·docker·llama
小挪号底迪滴8 小时前
Docker 多阶段构建实战:让 Python 镜像更小、更快、更安全
python·安全·docker
风曦Kisaki8 小时前
Kubernetes(K8s)笔记Day07: StatefulSet 有状态控制器详解与使用案例
linux·docker·云原生·容器·kubernetes
张文君9 小时前
docker registry 删除镜像
运维·docker·容器