【自定义镜像 |
您所在的位置:网站首页 › dockerfile执行sh文件不生效 › 【自定义镜像 |
Dockerfile完全指南
什么是Dockerfile
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。 Dockerfile由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 例如: ## Dockerfile文件格式 # 1、第一行必须指定 基础镜像信息 FROM java:8 # 2、维护者信息 MAINTAINER oldGj_ [email protected] # 3、镜像操作指令 RUN echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apache-tomcat-9.0.55.tar.gz" run tar -zxvf apache-tomcat-9.0.55.tar.gz -C /usr/local # 4、容器启动执行指令 CMD /usr/local/tomcat/bin/catalina.shDockerfile 四部分说明: 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.最后是CMD指令,来指明运行容器时的操作命令. 构建镜像简单示例 在一个空白的文本文件, 命名为Dockerfile vim Dockerfile示例1 Dockerfile文件内容: #基础镜像 FROM centos #维护者 MAINTAINER oldGj_ #运行命令 RUN "yum install wget" #启动容器运行命令 CMD echo "hello Dockerfile"示例2 Dockerfile文件内容: FROM java:8 MAINTAINER WCC CMD java -version 构建镜像 docker build -t 镜像名字:版本 .注意 . 代表Dockerfile文件在当前路径 常见的13种指令指定基础镜像,必须为第一个命令。 指令格式: FROM FROM :注意: tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像 MAINTAINER维护者信息 指令格式: MAINTAINER示例 MAINTAINER Jasper Xu MAINTAINER [email protected] WORKDIR工作目录,类似于cd命令 指令格式: WORKDIR /usr/workdir示例 WORKDIR /a (这时工作目录为/a) WORKDIR b (这时工作目录为/a/b) WORKDIR c (这时工作目录为/a/b/c)示例 WORKDIR /OPT RUN mkdir docker WORKDIR /usr/local RUN echo "test" > a.info注意: 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。 RUN构建镜像时执行的命令 指令语法: # 1. shell执行 格式 RUN # 2. exec执行 格式 RUN ["executable", "param1", "param2"]示例 WORKDIR /OPT RUN mkdir docker WORKDIR /usr/local RUN echo "test" > a.info注意: RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。 指令格式: ADD ... ADD ["",... ""] 用于支持包含空格的路径示例:示例 添加所有以"hom"开头的文件 ADD hom* /mydir/? 替代一个单字符,例如:“home.txt” ADD hom?.txt /mydir/添加 “test” 到 WORKDIR/relativeDir/ ADD test relativeDir添加 “test” 到 /absoluteDir/ ADD test /absoluteDir/ COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。 语法格式: COPY示例 COPY ./start.sh /start.sh CMD构建容器后调用,也就是在容器启动时才进行调用。指定这个容器启动的时候要运行的命令只有最后一个会生效可被替换。 指令格式: CMD指令与RUN指令相似,也具有两种格式: 1. shell格式:CMD 2. exec格式: CMD ["可执行文件", "参数1", "参数2", …]示例 CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]注意: CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。 ENTRYPOINT配置容器,使其可执行化。配合CMD可省去"application",只使用参数。 指定容器启动的要运行的命令,可以追加命令 指令格式: ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 (shell内部命令)示例 ENTRYPOINT ["top", "-b"]注意: ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。 ENV这个指令非常简单,就是用于设置环境变量而已,无论是接下来的指令,还是在容器中运行的程序,都可以使用这里定义的环境变量。 指令格式: ENV =示例 ENV JAVA_HOME=/usr/local/jdk1.7.0_79 ENV PATH=$JAVA_HOME/bin:$PATH EXPOSE指定于外界交互的端口 指令格式: EXPOSE 示例 EXPOSE 80注意: EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。 VOLUME用于指定持久化目录 指令格式: VOLUME ["/path/to/dir"]示例 VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2"]注意: 一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它 USERUSER指令用于将会用以什么样的用户去运行 指令格式: USER user USER user:group注意: 使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。 ONBUILD帮助别人定制而准备的 指令格式: ONBUILD [INSTRUCTION]示例 FROM centos WORKDIR /data ONBUILD RUN mkdir test FROM test:02 CMD和ENTRYPOINT的区别区别: CMD #指定这个容器启动的时候要运行的命令,可被替换ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令例子 Dockerfile文件 #基础镜像 from centos #启动容器运行命令 CMD ["ls" ,"-a"]构建镜像 docker build -t test04:v1 . Dockerfile综合实验 构建Tomcat镜像首先,尝试在DockerHub上搜索Tomcat相关镜像的个数 docker search tomcat |wc -l有26个,如果是个人开发或者测试,随意使用一个,若是生产环境使用,就不合适了。 项目需要的Tomcat版本可能不同。项目需要的Tomcat变量不一致。项目需要的JDK可能不一致。因此比较好的方式有架构师或者项目经理通过Dockerfile或者其他方法构建统一的镜像,然后分发给项目组所有成员来进行。 构建步骤 编写一个dockerfile 文件docker build构建成为一个镜像docker run运行镜像 Dockerfile文件 #基础镜像 FROM openjdk:11 #维护者 MAINTAINER oldGj_ #拷贝tomcat包 ADD ./apache-tomcat-9.0.50.tar.gz /usr/local #设置工作目录 WORKDIR /usr/local #设置tomcat环境变量 ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.50 ENV PATH=$PATH:$TOMCAT_HOME/bin #保留端口 EXPOSE 8080 #启动容器运行命令 CMD startup.sh && tail -F /usr/local/apache-tomcat-9.0.50/bin/catalina.bat |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |