参考文章

  1. Dockerfile 指令详解

Dockerfile中每一个指令都会建立一层。

RUN执行命令

RUN格式有两种

  1. shell格式

    1. RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  2. exec格式,这更像是函数调用的风格

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

ARG构建参数(声明build期间的变量名)

ARG用于声明一个变量名,例如,定义一个port的变量

  1. ARG port

docker build的时候,你可以通过命令行设置值,如

  1. docker build --build-arg port=5000

ARG只能在dockerfile中使用,即build期间使用
所以ARG变量的值,在容器中获取不到

ENV(给容器设置环境变量)

ENV用于定义环境变量,在docker run的时候ENV的配置会加载到容器的内部

  1. ENV JAVA_HOME /usr/local/jdk1.8.0_171
  2. ENV PATH $JAVA_HOME/bin:$PATH

获取宿主机的环境变量

  1. $MY_ENV_VAR

2022/1/14 ENV设置的环境变量,CMake读取不到!可以用这个代替

  1. RUN echo 'GLAL_3rdlib_DIR="/glal"' >> /etc/environment \
  2. && echo "source /etc/environment" >> ~/.bashrc

COPY复制文件

COPY有两种格式

  1. COPY [--chown=<user>:<group>] <源路径>... <目标路径>
  2. COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

使用

  1. 源路径可以多个
  2. 甚至可以是通配符,通配符规则要满足Go的filepath.Match规则
  3. 如果源路径为文件夹,复制的时候不是直接复制该文件夹,而是将文件夹中的内容复制到目标路径
    1. COPY package.json /usr/src/app/
    2. COPY hom* /mydir/
    3. COPY hom?.txt /mydir/
    参数:--chown=<user>:<group>改变文件的所属用户及所属组
    COPY --chown=55:mygroup files* /mydir/
    COPY --chown=bin files* /mydir/
    COPY --chown=1 files* /mydir/
    COPY --chown=10:11 files* /mydir/
    

ADD更高级的复制文件

ADD在COPY的基础上增加了一些功能

  • <源路径>可以是一个URL,下载后文件权限自动设置为600
  • 如果<源路径>为压缩包,ADD可以自动解压

CMD容器启动命令

Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的

CMD指令的格式和RUN相似,也具有两种风格

  • shell风格:CMD <命令>
  • exec风格:CMD ["可执行文件", "参数1", "参数2"...]

在运行时,可以指定新的命令,这个新的命令会替换掉CMD里设置的默认命令。
比如ubuntu镜像的CMD命令是CMD /bin/bash

  1. 运行docker run -it ubuntu,则最后会运行/bin/bash,进入命令行
  2. 运行docker run -it ubuntu cat /etc/os-release,则cat /etc/os-release会替换掉/bin/bash,最后输出了系统版本信息

WORKDIR指定工作目录

使用WORKDIR指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录

  • 如该目录不存在,WORKDIR 会帮你建立目录
    WORKDIR /app