赞
踩

https://blog.51cto.com/u_12020737/4539268

| 指令 | 说明 |
|---|---|
| FROM | 指明当前的镜像基于哪个镜像构建 |
| LABEL | 标记镜像信息,添加元数据 |
| ARG | 定义构建镜像过程中使用的变量 |
| ENV | 指定环境变量 |
| VOLUME | 创建一个数据卷挂载点 |
| USER | 指定运行容器时的用户名或 UID |
| WORKDIR | 配置工作目录 |
| EXPOSE | 容器运行时的端口,默认是TCP |
| ADD | 从本地或URL添加文件或压缩包到镜像中,并自动解压 |
| COPY | 拷贝文件或目录到镜像中 |
| ONBUILD | 创建子镜像时指定自动执行的操作指令 |
| STOPSIGNAL | 指定退出的信号值 |
| HEALTHCHECK | 配置启动容器如何进行健康检查 |
| SHELL | 指定默认 shell 类型 |
| RUN | 构建镜像时运行的指定命令 |
| CMD | 运行容器时默认执行的命令,如果有多个CMD质量,最后一个生效。 |
| ENTRYPOINT | 指定镜像的默认入口命令 |


MAINTAINER 参数已经弃用,用LABEL Author(作者名)="网站" 替代。
https://www.jdon.com/58758.html
构建镜像过程中使用的变量,RUN可以使用ARG变量,CMD和ENTRYPOINT不能使用ARG变量容器运行时使用的变量,ARG指定的变量不会容器运行时生效
# ENV示例:
# ENV <key1>=<value1> <key2>=<value2>...
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
注意:用户需事先建立好,否则无法切换
https://www.hi-linux.com/posts/44367.html
# 创建redis用户和redis组
RUN groupadd -r redis && useradd -r -g redis redis
以指定用户和组运行
# 指定用户和组
USER <user>[:<group>]
# 或
USER <UID>[:<GID>]
# 切换到redis用户运行
USER redis:redis
# 或
USER 1000:1000
# 设置工作目录--相当于cd到/app目录
## 没有这个目录会自动创建
WORKDIR /app
默认是TCP协议,如果要暴露UDP端口,需要单独添加
# 同时在 TCP、UDP 上暴露端口
EXPOSE 80/tcp
EXPOSE 80/udp
# 暴露端口段
EXPOSE 443-26000
EXPOSE 443-26000/udp
COPY: 把本地文件复制到容器;ADD: COPY的加强版,可以从url复制文件,并自动解压.
tar压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD指令将会自动解压缩这个压缩文件到 <目标路径> 去。URL下载和自动解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压。RUN命令执行命令并创建新的镜像层,通常用于安装软件包CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)ENTRYPOINT非json则已ENTRYPOINT为准,如果ENTRYPOINT和CMD都是json,则ENTRYPOINT+CMD拼接成shell

ONBUILD是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行;
只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行
Dockerfile中的其它指令都是为了定制当前镜像而准备的,唯有ONBUILD是为了帮助别人定制自己而准备的.
https://blog.51cto.com/u_12020737/4539269
一个 dockerfile 可以有多个 FROM来创建多个镜像,或区分构建阶段,将一构建阶段作为二构建阶段的依赖项;
AS <阶段名> 就是命名当前构建阶段;
在后续构建阶段,可以给 FROM、COPY 指令用上,通过 --from=<上一个阶段名> 引用上一阶段构建的镜像.
例如:
1阶段编译好二进制文件;
2阶段COPY编译好的二进制文件;2阶段构建的容器会很小.
分阶段构建镜像,可以有效减小镜像.
https://blog.51cto.com/u_12020737/4539257
建议使用VScode安装docker插件,能提供部分自动补全。

# 创建nginx项目目录
mkdir -p nginx
# 创建dockerfile文件
## dockerfiles的默认名称:dockerfile和Dockerfile
vim nginx/Dockerfile
ENV和.dockerignore忽略文件参考: https://www.yafa.moe/post/cka-docker-basic/
# 忽略文件
.dockerignore

# 基于redhat8镜像构建新镜像 ## 请勿使用latest标签 #FROM redhat/ubi8:8.7-1090 FROM almalinux:8.7-minimal-20230222 # 标签:作者信息 ## LABEL key="value" LABEL qiaofei.li="https://blog.csdn.com/omaidb" # 构建镜像时运行的命令 RUN yum makecache && \ yum install -y gcc make \ pcre pcre-devel zlib zlib-devel \ openssl openssl-devel && \ yum clean all && \ rm -rf /var/cache/yum/* # 设置软件的版本号为变量 ENV VERSION=1.18.0 # 解压并拷贝文件到镜像 ## copy --把`文件`复制到容器 ## add --是copy的加强版,可以从url复制文件 ADD nginx-${VERSION}.tar.gz / # 构建镜像时运行的命令,编译安装nginx RUN cd nginx-${VERSION} && \ ./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_realip_module \ --with-threads && \ make -j && make install && \ mkdir /usr/local/nginx/conf/vhost && \ cd / && rm -rf nginx* && \ ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置环境变量 ENV PATH $PATH:/usr/local/nginx/sbin # 将配置文件copy到镜像中 # COPY nginx.conf /usr/local/nginx/config/nginx.conf # 设置工作目录 WORKDIR /usr/local/nginx # 容器使用的端口 # 默认是tcp EXPOSE 80 # 如果要开放udp,需要单独加 EXPOSE 80/udp # 容器运行的命令,Nginx守护进程的固定格式 CMD ["nginx", "-g", "daemon off;"]
Dockerfile文件的名称没有任何扩展名,一般默认是大写D和小写f.
dockerfiles的默认名称:dockerfile和Dockerfile. 如果文件名中有其他大写字母,它很可能会失败。

如果你不需要使用buildkit,在执行构建Dockerfile之前禁用。
export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0
https://stackoverflow.com/questions/64985913/failed-to-solve-with-frontend-dockerfile
# 在dockerfile同目录下执行build命令
## docker build -t 构建出的镜像名:标签 .表示dockerfile文件在当前目录下
docker build -t nginx:v1 .
## -f 指定dockerfile文件
### -f时,dockerfile文件可以是任何后缀名
docker build . -f ./temp.txt

BuildKit也是非常好的dockfile构建工具
项目地址: https://github.com/moby/buildkit
将Docker镜像体积减小99%: https://juejin.cn/post/6844904101348638734
构建镜像Dockerfile文件优化:
减少镜像层: 一次RUN指令形成新的一层,尽量Shell命令都写在一行,减少镜像层。清理无用文件: 清理对应的残留数据,例如yum缓存。清理无用的软件包: 基础镜像默认会带一些debug工具,可以删除掉,仅保留应用程序所需软件,防止黑客利用。选择最小的基础镜像: 例如alpine使用非root用户运行: USER指令指定普通用户,降低权限分析镜像构建 https://blog.csdn.net/omaidb/article/details/122044116
# 查看nginx镜像的文件层
docker history omaidb/gost:3.0.0-rc6

ERROR: failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount2237603866/Dockerfile: no such file or directory

原因:dockerfile名称不对。
将dockerfile文件重命名为Dockerfile
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。