RUN 功能为运行指定的命令 RUN命令有两种格式 - 1. RUN <command>
- 2. RUN ["executable", "param1", "param2"]
复制代码第一种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c 在windows操作系统上默认 cmd /S /C 第二种是类似于函数调用。 可将executable理解成为可执行文件,后面就是两个参数。 CMD功能为容器启动时默认命令或参数 语法有三种写法
- CMD ["executable","param1","param2"]
- CMD ["param1","param2"]
- CMD command param1 param2
复制代码第三种比较好理解了,就时shell这种执行方式和写法 第一种和第二种其实都是可执行文件加上参数的形式 举例说明两种写法: - CMD [ "sh", "-c", "echo $HOME"
- CMD [ "echo", "$HOME" ]
复制代码补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array RUN&&CMD
不要把RUN和CMD搞混了。
RUN是构件容器时就运行的命令以及提交运行结果
CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子
ENTRYPOINT功能是:容器启动时运行得启动命令 语法如下: - ENTRYPOINT ["executable", "param1", "param2"]
- ENTRYPOINT command param1 param2
复制代码如果从上到下看到这里的话,那么你应该对这两种语法很熟悉啦。 第二种就是写shell (shell执行) 第一种就是可执行文件加参数(EXEC调用,可在docker run启动时传递参数) 与CMD比较说明(这俩命令太像了,而且还可以配合使用): 相同点: 只能写一条,如果写了多条,那么只有最后一条生效 容器启动时才运行,运行时机相同
不同点: ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
如下: - FROM ubuntu
- ENTRYPOINT ["top", "-b"]
- CMD ["-c"]
复制代码如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效 如下: - FROM ubuntu
- ENTRYPOINT ["top", "-b"]
- CMD ls -al
复制代码那么将执行ls -al ,top -b不会执行。 Docker官方使用一张表格来展示了ENTRYPOINT 和
CMD不同组合的执行情况
VOLUME 可实现挂载功能,可以将宿主机目录挂载到容器中 说的这里大家都懂了,可用专用的文件存储当作Docker容器的数据存储部分 语法如下: 说明: [“/data”]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的 - VOLUME ["/var/log/"]
- VOLUME /var/log
- VOLUME /var/log /var/db
复制代码一般的使用场景为需要持久化存储数据时 容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。 所以当数据需要持久化时用这个命令。 USER设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的 注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行,
使用这个命令一定要确认容器中拥有这个用户,并且拥有足够权限 WORKDIR语法: 设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。 如: - WORKDIR /a
- WORKDIR b
- WORKDIR c
- RUN pwd
复制代码pwd执行的结果是/a/b/c WORKDIR也可以解析环境变量 如: - ENV DIRPATH /path
- WORKDIR $DIRPATH/$DIRNAME
- RUN pwd
复制代码pwd的执行结果是/path/$DIRNAME
|