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 时运行。

相关推荐
千寻girling1 天前
记录第一次学习 Docker
学习·docker·容器
迷糊小面包1 天前
Docker Hadopp集群版部署搭建及常规问题解疑
运维·docker·容器
烁3471 天前
Docker
运维·docker·容器
网络中的夜鹰1 天前
轩辕镜像一键安装Docker和Docker Compose脚本
运维·docker·容器
梦想的颜色1 天前
从零入门:Docker在Ubuntu上的安装、使用与主流镜像仓库实战(Java/Go/MySQL/PostgreSQL/MongoDB/Nginx
java·ubuntu·docker
java知路1 天前
centos euler离线下载docker镜像
linux·docker·centos
江湖有缘1 天前
Docker部署HamsterBase Tasks任务管理工具
运维·docker·容器
很楠爱上1 天前
Docker 从入门到实战:核心概念、微服务编排与环境移植完全指南
docker·微服务·容器
Qres8211 天前
docker & WSL & Ubuntu安装记录
ubuntu·docker·容器·wsl
fengchengwu20121 天前
Hermes Agent Docker 部署笔记 —— 接入 MiniMax
docker·hermes