Dockerfile常用指令

目录

1、介绍(详细见格式)

2、格式

2.1  COPY

2.2  ADD 更高级的复制文件

2.3  CMD 容器启动命令

2.4  ENTRYPOINT 入口点

2.5  ENV 设置环境变量

2.6  ARG 构建参数

2.7  VOLUME 定义匿名卷

2.8  EXPOSE 声明端口

2.9  WORKDIR 指定工作目录

3.0  USER 指定当前用户

3.1  总结

1、介绍(详细见格式)

FROM    指定基础镜像(常用)

RUN    用来执行命令行命令的(常用)

ADD    复制文件,会自动解压

WORKDIR    设置进入容器后的当前工作目录,默认是/目录,可 设置为root家目录【WORKDIR /root】,表示当容器 启动后会自动进入/root下而不是/下,相当于cd。

EXPOSE    指定对外端口【若做了指定端口映射,docker ps可以看到指定的对外端口,若没做指定端口映射,默认在PORTS列为空,使用此选项可以看到指定的端 口与宿主机的哪些端口做了映射,例EXPOSE 22 80, 这样就可以看到22和80与宿主机的哪些端口做了 随机映射,】,-p 是随机端口,EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!

CMD    指定容器启动后要做什么(容易被替换)

ENTRYPOINT    容器启动后执行的命令,使用此参数后初始命令不 容易被覆盖

VOLUME    设置卷,挂载工作目录(不常用)

ENV    容器的环境变量

COPY    复制文件,目录一定要以/结尾不然会识别成文件

【容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD】

【若制作镜像时候不指定CMD,会自动使用初始镜像内的CMD命令

2、格式

2.1  COPY

格式:COPY  主机路径下文件 容器内路径下

COPY <源路径>... <目标路径>

COPY ["<源路径1>",... "<目标路径>"]

COPY hom* /mydir/

COPY hom?.txt /mydir/

文件和dockerfile要在同一目录下,且不要使用绝对路径,如下所示

【COPY    test.sh /root/test.sh 这种是对的

【COPY    /root/test.sh /root/test.sh 主机路径使用绝对路径会报错

2.2  ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。在某些情况下,这个自动解压缩的功能非常有用。

FROM scratch

ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

官方要求尽可能的使用 COPY ,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用COPY 指令,仅在需要自动解压缩的场合使用 ADD。

2.3  CMD 容器启动命令

CMD <命令>

CMD echo $HOME

CMD ["可执行文件", "参数1", "参数2"...]

CMD [ "sh", "-c", "echo $HOME" ]

CMD ["参数1", "参数2"...]

CMD 指令就是用于指定默认的容器主进程的启动命令的,在运行时可以指定新的命令来替代镜像设置中的这个默认命令

【注意:Docker不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样;CMD service nginx start这种写法时错误的】

【正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行;CMD ["nginx", "-g", "daemon off;"]】

【若制作镜像时候不指定CMD,会自动使用初始镜像内的CMD命令

2.4  ENTRYPOINT 入口点

ENTRYPOINT的格式和 RUN 指令格式一样,ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数--entrypoint来指定。应用场景:

 让镜像变成像命令一样使用

 应用运行前的准备工作

2.5  ENV 设置环境变量

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>

ENV VERSION=1.0 DEBUG=on

ENV NODE_VERSION 7.2.0

2.6  ARG 构建参数

ARG <参数名>[=<默认值>]

和 ENV 的效果一样,都是设置环境变量。所不同的是, ARG 所设置的构建环境的

环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的,该默认值可以在构建命令docker build中用--build-arg <参数名>=<值>来覆盖。

2.7  VOLUME 定义匿名卷

VOLUME ["<路径1>", "<路径2>"...]

VOLUME <路径>

① dockerfile中写法:VOLUME /data

② docker run -d -v mydata:/data xxxx,在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了Dockerfile 中定义的匿名卷的挂载配置。

2.8  EXPOSE 声明端口

EXPOSE <端口1> [<端口2>...]

EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来,若不使用的话就是docker随机映射了

参数-p ,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问。

EXPOSE命令只是声明了容器应该打开的端口并没有实际上将它打开!也就是说,如果你不用-p或者-P中指定要映射的端口,你的容器是不会映射端口出去的,从而我们知道我们是没有办法在Dockerfile里面进行端口映射的,我们只能在容器启动的时候或者在docker-compose文件中使用ports来指定将要映射的端口。

那我们的EXPOSE能用来干什么呢?第一点就是写在Dockerfile中进行声明,能让运维人员或者后来者知道我们开启了容器的哪些端口。还有一点就是,当我们声明了EXPOSE端口之后,我们使用-P命令进行随机映射的时候,是会对这个端口进行映射的。比如说我们现在对一个tomcat容器进行EXPOSE 9999声明,那么我们进行-P随机映射的时候是会对9999端口进行映射的。

2.9  WORKDIR 指定工作目录

WORKDIR <工作目录路径>

3.0  USER 指定当前用户

WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。

[root@test-ybb-1 test3]# cat dockerfile

FROM nginx:latest

RUN useradd qq

USER qq

RUN echo "hello" > world.txt

3.1  总结

如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo ,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu(该命令需要下载安装)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44250083

微信号:c_x_y_000

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值