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=<user>:<group>] <源路径1>... <目标路径>

COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

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

CMD

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

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

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

格式:

CMD <shell 命令>

CMD ["<可执行文件或命令>","<param1>","<param2>",...]

CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

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

ENTRYPOINT

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

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

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

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

格式:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

可以搭配 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 时运行。

相关推荐
Code_Artist14 分钟前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao123416 分钟前
centos 服务器 docker 使用代理
服务器·docker·centos
Eternal-Student23 分钟前
【docker 保存】将Docker镜像保存为一个离线的tar归档文件
运维·docker·容器
不是二师兄的八戒25 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
码农小丘31 分钟前
一篇保姆式centos/ubuntu安装docker
运维·docker·容器
Eternal-Student1 小时前
【1.2 Getting Started--->Installation Guide】
docker
yunfanleo3 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
梅见十柒5 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
意疏18 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
墨鸦_Cormorant18 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker