目录
DockerFile 命令详解
首页 运维 Docker 带你深入了解DockerFile命令

带你深入了解DockerFile命令

Feb 22, 2022 pm 05:40 PM
docker

本篇文章给大家带来了关于dockerFile命令的相关知识,该命令包含一条条指令,每条指令构建一层的镜像制作文件,希望对大家有帮助。

带你深入了解DockerFile命令

推荐学习:《docker视频教程

DockerFile 命令详解

Dockerfile 是包含一条条指令,每条指令构建一层的镜像制作文件。

构建镜像

docker build [选项] <上下文路径/URL/->

docker build -t nginx:v3 .           # . 表示Dockerfile在当前目录
登录后复制

FROM 指定基础镜像

通过FROM指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

FROM scratch,这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像,接下来的指令将作为镜像第一层开始存在。

RUN 执行命令

RUN 用来执行命令行命令,其格式有两种:

shell 格式:

RUN <命令>

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
登录后复制

exec 格式:

RUN ["可执行文件", "参数1", "参数2"]
登录后复制

Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过 127 层,相同功能应该使用 && 将各个所需命令串联起来简化镜像的层数

COPY 复制文件

COPY [--chown=<user>:<group>] <宿主机源路径> <镜像内的目标路径>
COPY [--chown=<user>:<group>] ["<宿主机源路径1>",... "<镜像内的目标路径>"]
登录后复制
# 把当前目录的a.txt文件复制到镜像的根目录
COPY a.txt /a.txt
登录后复制

ADD 复制文件(下载文件或解压文件)

ADD [--chown=<user>:<group>] http://xxx <目标路径>       # 下载文件到镜像的目标路径
ADD [--chown=<user>:<group>] ./a.tar.gz <目标路径>       # 复制压缩包,并自动解压到目标路径
登录后复制

CMD 指定默认的容器主进程的启动命令

CMD ["可执行文件", "参数1", "参数2"...]
登录后复制
# 指定进入容器马上指定 cat /a.txt

CMD ["sh","-c", "cat /a.txt"]
登录后复制

执行 docker run -it 镜像的时候,如果不指定命令类似 /bin/bash ,会自动执行 sh -c cat /a.txt,否则会按用户指定的CMD

ENTRYPOINT 指定容器主进程的启动命令,类似CMD

格式与CMD一致,差异点

1、使用ENTRYPOINT可以传参

在Dockerfile中指定ENTRYPOINT [ "curl", "-s", "http://myip.ipip.net" ],命令行通过 docker run myip -i 时,会把 -i 参数传给 ENTRYPOINT 的命令,最后进入
容器时,容器会执行 curl -s http://myip.ipip.net -i

2、执行一些与 CMD 无关的初始化工作,与容器 CMD 无关的,无论 CMD 为什么,都需要事先进行一个预处理的工作。

类似 ENTRYPOINT ["docker-entrypoint.sh"]  这个脚本里检查用户的身份是否合法等

ENV 设置环境变量

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
登录后复制

ARG 构建参数

ARG <参数名>[=<默认值>]
登录后复制

ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。

ARG DOCKER_USERNAME=library

FROM ${DOCKER_USERNAME}/alpine
登录后复制

如果在FROM之后指定,对于在各个阶段中使用的变量都必须在每个阶段分别指定

FROM ${DOCKER_USERNAME}/alpine

# 在FROM 之后使用变量,必须在每个阶段分别指定
ARG DOCKER_USERNAME=library

RUN set -x ; echo ${DOCKER_USERNAME}
登录后复制

VOLUME 匿名卷

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
登录后复制

为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据

这里的 /data 目录就会在容器运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。

EXPOSE 暴露端口

EXPOSE <端口1> [<端口2>...]
登录后复制

EXPOSE 指令是声明容器运行时提供服务的端口,EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;

另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。

-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问。

WORKDIR 指定工作目录,如该目录不存在,WORKDIR 会建立目录

WORKDIR <工作目录路径>
登录后复制

例子1:

WORKDIR /app

RUN echo "hello" > world.txt
登录后复制

例子2:

WORKDIR /a
WORKDIR b
WORKDIR c

RUN pwd

## RUN pwd 的工作目录为 /a/b/c
登录后复制

USER 指定当前用户

USER <用户名>[:<用户组>]
登录后复制

如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu。

# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis

# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.12/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
    
# 设置 CMD,并切换到redis用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]
登录后复制

HEALTHCHECK 告诉 Docker 如何进行判断容器的状态是否正常

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
登录后复制

选项:

--interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次
登录后复制

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。

HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效

CMD 命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败

ONBUILD 指定某些命令只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行

ONBUILD <其它指令>
登录后复制
# 举例如下Dockerfile,初次构建为镜像my-node时,ONBUILD的三行命令不会执行

FROM node:slim
RUN mkdir /app
WORKDIR /app
ONBUILD COPY ./package.json /app
ONBUILD RUN [ "npm", "install" ]
ONBUILD COPY . /app/
CMD [ "npm", "start" ]

# 只要当其他镜像 FROM my-node 从上面镜像作为基础镜像进行构建时,ONBUILD 的命令开始执行
登录后复制

LABEL 为镜像添加元数据

LABEL <key>=<value> <key>=<value> <key>=<value> ...
登录后复制
# 标注镜像的作者

LABEL org.opencontainers.image.authors="yeasy"
登录后复制

SHELL 指定执行shell命令的参数

SHELL ["可执行程序", "参数"]
登录后复制
SHELL ["/bin/sh", "-c"]

RUN lll ; ls             # 这里的shell命令将通过 /bin/sh -c 的方式执行
登录后复制

推荐学习:《docker视频教程

以上是带你深入了解DockerFile命令的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

docker镜像源怎么换国内 docker镜像源怎么换国内 Apr 15, 2025 am 11:30 AM

可切换到国内镜像源,步骤如下:1. 编辑配置文件 /etc/docker/daemon.json,添加镜像源地址;2. 保存退出后,重启 Docker 服务 sudo systemctl restart docker,即可提升镜像下载速度和稳定性。

docker desktop怎么用 docker desktop怎么用 Apr 15, 2025 am 11:45 AM

如何使用 Docker Desktop?Docker Desktop 是一款工具,用于在本地机器上运行 Docker 容器。其使用步骤包括:1. 安装 Docker Desktop;2. 启动 Docker Desktop;3. 创建 Docker 镜像(使用 Dockerfile);4. 构建 Docker 镜像(使用 docker build);5. 运行 Docker 容器(使用 docker run)。

docker版本怎么看 docker版本怎么看 Apr 15, 2025 am 11:51 AM

要获取 Docker 版本,您可以执行以下步骤:运行 Docker 命令“docker --version”来查看客户端和服务器版本。对于 Mac 或 Windows,还可以通过 Docker Desktop GUI 的“版本”选项卡或“关于 Docker Desktop”菜单查看版本信息。

docker怎么创建镜像 docker怎么创建镜像 Apr 15, 2025 am 11:27 AM

创建 Docker 镜像步骤:编写包含构建指令的 Dockerfile。在终端中构建镜像,使用 docker build 命令。标记镜像,使用 docker tag 命令分配名称和标签。

docker怎么更新镜像 docker怎么更新镜像 Apr 15, 2025 pm 12:03 PM

更新 Docker 镜像的步骤如下:拉取最新镜像标记新镜像为特定标签删除旧镜像(可选)重新启动容器(如果需要)

docker怎么查看日志 docker怎么查看日志 Apr 15, 2025 pm 12:24 PM

查看 Docker 日志的方法包括:使用 docker logs 命令,例如:docker logs CONTAINER_NAME使用 docker exec 命令运行 /bin/sh 并查看日志文件,例如:docker exec -it CONTAINER_NAME /bin/sh ; cat /var/log/CONTAINER_NAME.log使用 Docker Compose 的 docker-compose logs 命令,例如:docker-compose -f docker-com

docker怎么搭建私有仓库 docker怎么搭建私有仓库 Apr 15, 2025 am 11:06 AM

您可以构建 Docker 私有仓库以安全地存储和管理容器镜像,提供严格的控制和安全性。步骤包括:创建存储库、授予访问权限、部署仓库、推送镜像和拉取镜像。优点包括安全性、版本控制、减少网络流量和定制化。

docker lnmp怎么调用 docker lnmp怎么调用 Apr 15, 2025 am 11:15 AM

Docker LNMP 容器调用步骤:运行容器:docker run -d --name lnmp-container -p 80:80 -p 443:443 lnmp-stack获取容器 IP:docker inspect lnmp-container | grep IPAddress访问网站:http://&lt;容器 IP&gt;/index.phpSSH 访问:docker exec -it lnmp-container bash访问 MySQL:mysql -u roo

See all articles