https://www.kancloud.cn/letao99/docker-install/1509214
FROM
格式: FROM <image> 或者 FROM <image>:<tag>
基础镜像,当前新镜像是基于哪个镜像进行创建。即当前镜像继承自哪个镜像。Dockerfile 文件必须指定且需要在其他指令的前面指定。后续的指令都依赖于该指令指定的镜像。FROM指令指定的基础镜像可以是官方远程仓库中的,也可以位于本地仓库。
在一个Dockerfile中FROM指令可以出现多次,这样会构建多个镜像。tag的默认值是latest,如果参数image或者tag指定的镜像不存在,则返回错误。
ENV
格式: ENV <key> <value> 或者 ENV <key>=<value> ...
ENV指令可以为镜像创建出来的容器声明环境变量。并且在Dockerfile中,ENV指令声明的环境变量会被后面的特定指令(即ENV、ADD、COPY、WORKDIR、EXPOSE、VOLUME、USER)解释使用。
其他指令使用环境变量时,使用格式为$variable_name
或者${variable_name}
。如果在变量面前添加斜杠\可以转义。如\$foo
或者\${foo}
将会被转换为$foo
和${foo}
,而不是环境变量所保存的值。
COPY
格式: COPY <src> <dest>
COPY指令复制所指向的文件或目录,将它添加到新镜像中,复制的文件或目录在镜像中的路径是<dest>
。<src>
所指定的源可以有多个,但必须是上下文根目录中的相对路径。
不能只用形如 COPY ../something /something
这样的指令。此外,<src>
可以使用通配符指向所有匹配通配符的文件或目录,例如,COPY home* /mydir/ 表示添加所有以"hom"开头的文件到目录/mydir/中。
<dest>
可以是文件或目录,但必须是目标镜像中的绝对路径或者相对于WORKDIR的相对路径(WORKDIR即Dockerfile中WORKDIR指令指定的路径,用来为其他指令设置工作目录)。
若<dest>
以反斜杠/结尾则其指向的是目录;否则指向文件。<src>
同理。若<dest>
是一个文件,则<src>
的内容会被写到<dest>
中;否则<src>
指向的文件或目录中的内容会被复制添加到<dest>
目录中。
当<src>
指定多个源时,<dest>
必须是目录。如果<dest>
不存在,则路径中不存在的目录会被创建。
EXPOSE
格式: EXPOSE <port> [<port>/<protocol>...]
EXPOSE指令通知Docker该容器在运行时侦听指定的网络端口。可以指定端口是侦听TCP还是UDP,如果未指定协议,则默认值为TCP。
这个指令仅仅是声明容器打算使用什么端口而已,并不会自动在宿主机进行端口映射,可以在运行的时候通过docker -p指定。
ENTRYPOINT
ENTRYPOINT指令有两种格式。
格式1:ENTRYPOINT <command>
(shell格式)
格式2:ENTRYPOINT ["executable", "param1", "param2"]
(exec格式,推荐格式)
ENTRYPOINT指令和CMD指令类似,都可以让容器在每次启动时执行相同的命令,但它们之间又有不同。一个Dockerfile中可以有多条ENTRYPOINT指令,但只有最后一条ENTRYPOINT指令有效。
当使用Shell格式时,ENTRYPOINT指令会忽略任何CMD指令和docker run命令的参数,并且会运行在bin/sh -c中。这意味着ENTRYPOINT指令进程为bin/sh -c的子进程,进程在容器中的PID将不是1,且不能接受Unix信号。即当使用docker stop <container>
命令时,命令进程接收不到SIGTERM信号。
推荐使用exec格式,使用此格式时,docker run传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT指令的参数中。从ENTRYPOINT的使用中可以看出,CMD可以是参数,也可以是指令,而ENTRYPOINT只能是命令;另外,docker run命令提供的运行命令参数可以覆盖CMD,但不能覆盖ENTRYPOINT。
#制定基础镜像,必须为第一个命令
FROM anapsix/alpine-java:8_server-jre_unlimited#维护者信息
MAINTAINER deployment deployment@beree.cn#构建镜像时执行的命令,这里我们创建一个目录
RUN mkdir -p /beree/beree-urip-core#转到工作目录。类似 cd ***
WORKDIR /beree/beree-urip-core#指定于外界交互的端口,比如我们再容器中启动的端口为8801,那么我们再宿主机使用localhost:801 即可以访问到容器中801端口对用的应用
EXPOSE 801#将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD ./target/beree-urip-core.jar ./app.jar#配置容器,使其可执行化,相当于执行命令 java -Djava.security.egd=file:/dev/./urandom -jar app.jar 要追加任何命令可以直接在 [ ] 数组中追加任何参数,但是要保证排序正确
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]#构建容器后调用,也就是在容器启动时才进行调用 相当于我们给容器启动过程增加参数,--spring.profiles.active=test 参数我们一般不再这里定义,我们可以放到 docer-compose 的变量定义里
CMD ["--spring.profiles.active=test"]