赞
踩
目录
- ## Dockerfile文件格式
- # 1、第一行必须指定 基础镜像信息
- FROM java:8
- # 2、维护者信息
- MAINTAINER baizhan baizhan@163.com
- # 3、镜像操作指令
- RUN echo "wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.55/bin/apachetomcat-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.sh
Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令. er
vim Dockerfile
- #基础镜像
- FROM centos
- #维护者
- MAINTAINER first<first@163.com>
- #启动容器运行命令
- CMD echo "hello Dockerfile"
- FROM java:8
- MAINTAINER WCC
- CMD java -version
docker build -t 镜像名字:版本 .
注意镜像名字和版本名称都是自己起。
注意. 代表Dockerfile文件在当前路径
咱们在刚在创建文件的那个目录下执行构建镜像命令。
docker build -t my_custom1:v1 .
Dockerfile文件中每一句话都对应一层的文件系统,我的文件内容用的示例一,所以会有三层文件系统,所以执行完上述命令之后,返回信息如下
咱们通过上面的命令已经把自己写的Dockerfile文件build成了一个镜像,现在咱们看看是否有这个镜像,然后创建并运行(run)
可以看到输出hello Dockerfile(是咱们Dockerfile中写的第三条命令),成功!
大家可以用示例2自己再练习一下。
- FROM <image>
- FROM <image>:<tag>
注意:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER <name>
示例
MAINTAINER Jasper Xu MAINTAINER sorex@163.com
WORKDIR /usr/workdir
示例:
先进了a里,下面两个都是相对路径(没加斜杠)
- WORKDIR /a (这时工作目录为/a)
- WORKDIR b (这时工作目录为/a/b)
- WORKDIR c (这时工作目录为/a/b/c)
注意:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、 COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
- # 1. shell执行
- 格式 RUN <command>
- # 2. exec执行
- 格式 RUN ["executable", "param1", "param2"]
示例:
- #启动容器后进入opt目录
- WORKDIR /OPT
- #运行容器之后新建docker目录(在/opt下建,因为我们是先进入到了/opt目录下)
- RUN mkdir docker
- #又切换了另一个目录
- WORKDIR /usr/local
- 把echo "test"重定向到a.info
- RUN echo "test" > a.info
注意:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
- ADD <src>... <dest>
- ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:
ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD test relativeDir
ADD test /absoluteDir/
COPY <源路径> <目标路径>
示例:
COPY ./start.sh /start.sh
- 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 ["executable", "param1", "param2"]
- ENTRYPOINT command param1 param2 (shell内部命令)
ENTRYPOINT ["top", "-b"]
注意:ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而 docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ENV <key>=<value>
示例
- #系统里的实际路径
- ENV JAVA_HOME=/usr/local/jdk1.7.0_79
- #将jdk文件的bin包配置到路径里,配置之后在任何路径都可以使用java命令
- ENV PATH=$JAVA_HOME/bin:$PATH
EXPOSE
示例
EXPOSE 80
注意:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
VOLUME ["/path/to/dir"]
- VOLUME ["/data"]
- VOLUME ["/var/www", "/var/log/apache2"]
注意:一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:1 卷可以容器间共享和重用2 容器并不一定要和其它容器共享卷3 修改卷后会立即生效4 对卷的修改不会对镜像产生影响5 卷会一直存在,直到没有任何容器在使用它
USER
- USER user
- USER user:group
注意:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过-u参数来覆盖所指定的用户。
ONBUILD
ONBUILD [INSTRUCTION]
- FROM centos
- WORKDIR /data
- ONBUILD RUN mkdir test
然后把这个build成镜像,镜像搭建起来之后按理说在会切换到data目录下,且该目录下有test文件夹,但是却没有,因为用ONBUILD修饰了之后,这个Dockerfile形成的镜像文件是用来被别的Dockerfile文件引用的,而不是自己用。就像下面一样,比如我再写另一个Dockerfile文件,我开头可以直接如下写,相当于代码语法里面的继承。
FROM test:02
- #基础镜像
- from centos
- #启动容器运行命令
- CMD ["ls" ,"-a"]
docker build -t test04:v1 .
然后咱们docker run的时候,想执行什么命令可以在最后面添加,如果Dockerfile里用的是CMD的话,那么就是代表替换CMD要执行的命令;如果Dockerfile里用的是ENTRYPOINT 的话,那么就是代表在原来的命令后面追加,比如写个 -l,现在想执行的命令就是ls -al,而如果是CMD方式的话,在docker run语句最后追加一个-l就不对了,因为没有一条命令叫做-l
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。