企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 >[info]减少分层,缩小镜像体积。 使用.dockerignore ## 构建镜像 ~~~ docker build [选项] <上下文路径/URL/-> ~~~ ### 参数 ~~~ -t,--tag 打标签 ~~~ ## 构建上下文 构建时会将上下文的内容传到docker的服务端,需要使用的文件也需要放到这个上下文中。 ## FROM 指定存在的基础镜像 ~~~ FROM <image> 或者 FROM <image>:<tag> ~~~ ## MAINTAINER 指定作者和联系信息 ~~~ MAINTAINER <name> 比如:MAINTAINER hiyang echohiyang@foxmail.com ~~~ ## RUN 镜像构建过程中需要执行的指令 ~~~ shell模式 RUN <command> 默认使用`/bin/sh -c `执行命令 RUN yum install -y httpd exec模式 RUN ["executable", "param1", "param2"] RUN ["/bin/bash", "-c", "echo hello"] ~~~ ## CMD 指定容器运行时的默认行为 若运行时指定指令,则会被覆盖 ~~~ CMD ["executable", "param1", "param2"] CMD command param1 param2 ~~~ RUN和CMD看起来挺像,但是,CMD用来指定容器启动时用到的命令,只能有一条。当docker run时指定运行命令,将不会执行 ## ENTRYPOINT 格式类似CMD 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。 CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT的参数可以被--entrypoint覆盖;会比CMD或者docker run指定的命令要靠前执行。 ## EXPOSE ~~~ EXPOSE <port> [<port>...] EXPOSE 22 80 8443 ~~~ 这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口映射出去。 ## ENV 它主要是为后续的RUN指令提供一个环境变量;在构建过程和运行过程中同样有效 ~~~ ENV <key> <value>, 比如 ENV PATH /usr/local/mysql/bin:$PATH ENV MYSQL_version 5.6 ~~~ ## COPY 复制 ~~~ COPY <源路径>... <目标路径> ~~~ 构建上下文目录中 **<源路径>** 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 ,<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径 >[danger]使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。 ## ADD 高级复制 ~~~ ADD <src> <dest> ~~~ 提供了tar功能 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url(不推荐使用)。 ## VOLUME ~~~ VOLUME ["/data"] ~~~ 创建一个可以从本地主机或其他容器挂载的挂载点。 ## USER 默认使用root用户 ~~~ USER daemon ~~~ 执行 RUN , CMD 以及ENTRYPOINT 这类命令的身份 ## WORKDIR ~~~ WORKDIR /path/to/workdir ~~~ 需使用绝对路径 ## ONBUILD 镜像触发器,当镜像为用作其他镜像的基础镜像时会执行 会在构建过程中插入指令 ## HEALTHCHECK 选项 ~~~ --interval=<间隔> 两次健康检查的间隔,默认为 30 秒; --timeout=<时长> 健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒; --retries=<次数> 当连续失败指定次数后,则将容器状态视为unhealthy ,默认 3 次 ~~~ ### 测试用 ~~~ FROM nginx RUN apt-get update && apt-get install -y curl && rm -rf /var/lib /apt/lists/* HEALTHCHECK --interval=5s --timeout=3s \ CMD curl -fs http://localhost/ || exit 1 ~~~ ## docker build -t centos:base -f /soft/docker/Dockerfile /soft ~~~ docker build -t myweb:v1 . docker run -d --name web -p 80:80 myweb:v1 docker inspect --format '{{json .State.Health}}' web | python -m json.tool ~~~ [dockerfile最佳实践][] [1]:https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/