桃花烟雨暮迟迟 发表于 2023-2-21 11:33:05

Dockerfile详解超全(二)

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 arrayRUN&&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容器的数据存储部分语法如下:VOLUME ["/data"]
说明:[“/data”]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
一般的使用场景为需要持久化存储数据时容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。所以当数据需要持久化时用这个命令。USER设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的USER daemo
USER UID
注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行,
使用这个命令一定要确认容器中拥有这个用户,并且拥有足够权限WORKDIR语法:WORKDIR /path/to/workdir
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。如:WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
pwd执行的结果是/a/b/cWORKDIR也可以解析环境变量如:ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
pwd的执行结果是/path/$DIRNAME

snow 发表于 2023-2-21 11:33:42

出租一楼

桃花烟雨暮迟迟 发表于 2023-2-21 11:38:36

snow 发表于 2023-2-21 11:33
出租一楼

感谢支持:D

xiu 发表于 2023-2-21 12:14:23

虽然看不懂,但是感觉好厉害的样子
页: [1]
查看完整版本: Dockerfile详解超全(二)