搜索
 找回密码
 立即注册

Dockerfile详解超全(二)

桃花烟雨暮迟迟 2023-02-21 11:33 354

RUN

功能为运行指定的命令

RUN命令有两种格式

  1. 1. RUN <command>
  2. 2. RUN ["executable", "param1", "param2"]
复制代码

第一种后边直接跟shell命令


在linux操作系统上默认 /bin/sh -c

在windows操作系统上默认 cmd /S /C

第二种是类似于函数调用。

可将executable理解成为可执行文件,后面就是两个参数。

CMD

功能为容器启动时默认命令或参数

语法有三种写法


  1. CMD ["executable","param1","param2"]
  2. CMD ["param1","param2"]
  3. CMD command param1 param2
复制代码

第三种比较好理解了,就时shell这种执行方式和写法

第一种和第二种其实都是可执行文件加上参数的形式

举例说明两种写法:

  1. CMD [ "sh", "-c", "echo $HOME"
  2. CMD [ "echo", "$HOME" ]
复制代码

补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。

原因是参数传递后,docker解析的是一个JSON array

RUN&&CMD
不要把RUN和CMD搞混了。
RUN是构件容器时就运行的命令以及提交运行结果
CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

ENTRYPOINT

功能是:容器启动时运行得启动命令

语法如下:

  1. ENTRYPOINT ["executable", "param1", "param2"]
  2. ENTRYPOINT command param1 param2
复制代码

如果从上到下看到这里的话,那么你应该对这两种语法很熟悉啦。

第二种就是写shell (shell执行)

第一种就是可执行文件加参数(EXEC调用,可在docker run启动时传递参数)

与CMD比较说明(这俩命令太像了,而且还可以配合使用):

相同点:

只能写一条,如果写了多条,那么只有最后一条生效

容器启动时才运行,运行时机相同


不同点:

ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数


如下:

  1. FROM ubuntu
  2. ENTRYPOINT ["top", "-b"]
  3. CMD ["-c"]
复制代码

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效

如下:

  1. FROM ubuntu
  2. ENTRYPOINT ["top", "-b"]
  3. CMD ls -al
复制代码

那么将执行ls -al ,top -b不会执行。

Docker官方使用一张表格来展示了ENTRYPOINT 和
CMD不同组合的执行情况

20190223142654223.jpg

VOLUME

可实现挂载功能,可以将宿主机目录挂载到容器中

说的这里大家都懂了,可用专用的文件存储当作Docker容器的数据存储部分

语法如下:

  1. VOLUME ["/data"]
复制代码

说明:

[“/data”]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的

  1. VOLUME ["/var/log/"]
  2. VOLUME /var/log
  3. VOLUME /var/log /var/db
复制代码

一般的使用场景为需要持久化存储数据时

容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。

所以当数据需要持久化时用这个命令。

USER

设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的

  1. USER daemo
  2. USER UID
复制代码

注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行,
使用这个命令一定要确认容器中拥有这个用户,并且拥有足够权限

WORKDIR

语法:

  1. WORKDIR /path/to/workdir
复制代码

设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。

如:

  1. WORKDIR /a
  2. WORKDIR b
  3. WORKDIR c
  4. RUN pwd
复制代码

pwd执行的结果是/a/b/c

WORKDIR也可以解析环境变量

如:

  1. ENV DIRPATH /path
  2. WORKDIR $DIRPATH/$DIRNAME
  3. RUN pwd
复制代码

pwd的执行结果是/path/$DIRNAME


随机推荐

3 回复

snow
2023-2-21 11:33:42
出租一楼
桃花烟雨暮迟迟
2023-2-21 11:38:36
楼主

感谢支持
xiu
2023-2-21 12:14:23
虽然看不懂,但是感觉好厉害的样子
uid=50
欢迎大家加入西柚论坛!
游客
高级模式
返回顶部