企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## Dockerfile介绍 Dockerfile是docker构建镜像的基础,也是docker区别于其他容器的重要特征,正是有了Dockerfile,docker的自动化和可移植性才成为可能。 不论是开发还是运维,学会编写Dockerfile几乎是必备的,这有助于你理解整个容器的运行。 FROM , 从一个基础镜像构建新的镜像 FROM ubuntu MAINTAINER , 维护者信息 MAINTAINER William <wlj@nicescale.com> ENV , 设置环境变量 ENV TEST 1 RUN , 非交互式运行shell命令 RUN apt-get -y update RUN apt-get -y install nginx ADD , 将外部文件拷贝到镜像里,src可以为url ADD http://nicescale.com/ /data/nicescale.tgz # 将index.php复制到容器内的/var/www目录下 # 会自动解压tar包 ADD index.php /var/www/ # 用copy而不用add,因为ADD指令会自动解压tar文件 COPY redis.tgz /home/redis.tgz # 设置工作目录,exec进入容器就直接进入到这个目录中 WORKDIR /path/to/workdir WORKDIR /var/www USER , 设置用户ID USER nginx # 设置volume, 声明一个数据卷, 可用于挂载, []里面是路径 # 出于可移植和分享的考虑,用于-v主机目录:容器目录这种方法不能够直接在DockerFile中实现 # 可自行创建软链接实现特定目录挂载 VULUME <#dir> VOLUME ['/data'] EXPOSE , 暴露哪些端口 EXPOSE 80 443 ENTRYPOINT ["executable", "param1","param2"]执行命令 ENTRYPOINT ["/usr/sbin/nginx"] # 一般只用cmd就可以了 CMD ["param1","param2"] CMD ["start"] > docker创建、启动container时执行的命令: 如果设置了ENTRYPOINT,则CMD将作为参数 如果没有设置ENTRYPOINT, 则直接命令参数传入 比如要有使容器为“挂起”状态,否则容器运行不起,如果没有命令使用,或者使用命令报错,可以先用“/bin/bash” 或者 “sh” >[info] - 尽量将一些常用不变的指令放到前面 > - CMD和ENTRYPOINT尽量使用json数组方式 **通过Dockerfile构建image** # 构建 docker build -t allovince/php-helloworld:v1 . # 运行并绑定端口8080 docker run -d -p 8080:8080 allovince/php-helloworld ## Dockerfile示例 #使用的基础镜像 FROM centos #作者信息 MAINTAINER by caiwen (xiaogang.zhou@qq.com) WORKDIR /usr/local/src #安装wget RUN yum install -y wget #下载并解压源码包 RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz RUN tar -zxvf nginx-1.8.0.tar.gz WORKDIR nginx-1.8.0 #编译安装nginx RUN yum install -y gcc make pcre-devel zlib-devel RUN ./configure --prefix=/usr/local/nginx --with-pcre RUN make RUN make install #修改Nginx配置文件,以非daemon方式启动 RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf #开放22、80、443端口 EXPOSE 22 EXPOSE 80 EXPOSE 443 #设置生成容器时需要执行的脚本 CMD ["/usr/local/nginx/sbin/nginx","start"] 构建镜像 docker build -t nginx:v1 . ## 注意Dockerfile中的CD命令坑 - [RUN 中 cd 切换路径失败 的原因、解决](https://blog.csdn.net/jiangyu1013/article/details/82255353) > 每一个 `RUN` 都会启动一个容器、执行命令、然后提交存储层文件变更。所以CD只能在当前“Run”中有效。 ## 参考链接 * [dockerfile关键字笔记](https://www.jianshu.com/p/6bc1585552c9)