dockerfile 简明教程

dockerfile 简明教程

docker 命令可以参考:https://blog.csdn.net/a40850273/article/details/104510863

dockerfile 介绍

dockerfile 关键字:

  • FROM:用于指定用于构建的基础镜像。后续的操作将在这个镜像上进行个性化安装。引用的基础镜像可以是本地镜像也可以远程镜像,本地镜像通过 [镜像名:Tag] 的方式进行引用,远程镜像通过 [ip:端口号/镜像名:Tag] 的方式进行应用
  • ENV:设置环境变量,在后续的指令中,就可以使用这个环境变量。
  • ARG:构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。 会被 docker build 中 --build-arg <参数名>=<值> 覆盖。
  • COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
  • ADD:ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。区别在于 ADD 会将源文件中的 tar 压缩文件自动复制并解压。
  • RUN:指定在构建过程中需要运行的指令。每执行一次 RUN 都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。因此建议使用过 && \ 将多条命令拼接执行。
  • CMD:指定在容器运行中需要执行的指令,会被 docker run 时指定要运行的指令所覆盖。多个 CMD ,仅最后一个有效。
  • ENTRYPOINT:类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
  • WORKDIR:指定工作目录,构建过程中会自动创建。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都起作用。
  • VOLUME:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免重要的数据,因容器重启而丢失,这是非常致命的。
  • EXPOSE:仅仅只是声明端口。帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
  • USER:用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

通过 ENTRYPOINT 和 CMD 实现变参运行

dockerfile 简明教程_第1张图片

一个简单的例子

FROM nvidia/cuda:10.2-base

ENV BASE_PATH=/root/object_detect
ENV PYTHON_PATH=python3.8

WORKDIR $BASE_PATH

ADD . $BASE_PATH

RUN rm -rf /etc/apt/sources.list.d/* && \
    apt-get update && \
    mkdir /root/.pip && \
    cp pip.conf /root/.pip/pip.conf && \
    apt-get -y install python3-pip && \
    apt-get -y install $PYTHON_PATH && \
    $PYTHON_PATH -m pip install -r requirements.txt && \
    $PYTHON_PATH -m pip install -r app/requirements.txt && \
    apt-get install -y libsm6 && \
    apt-get install -y libxrender1 && \
    apt-get install -y libxext-dev
    
ENTRYPOINT $PYTHON_PATH app/manager.py

需要注意的点:

  • 避免多条 RUN 指令造成镜像过大,使用 && \
  • 构建过程中需要联网,比如 apt-get,需要在 docker build 命令中添加 --network=host 选项
  • 如果命令需要人工进行选择,需要通过选项指定进行的操作,比如 apt-get -y
  • 通过 python3-pip 安装 pip 时,系统会根据系统关联的 python 版本进行安装。如果需要对其他 python 版本进行 pip 操作,可以通过 python -m pip install 进行。

docker build 命令

docker build -t test:v1.0 --network=host .
  • docker build 通过制定的路径下的 dockerifle 文件进行镜像构建。最后的 . 为构建目录,默认使用构建目录下的 dockerfile,也可以使用 -f 选项制定特定路径下的 dockerfile
  • -t test:v1.0 用于制定构建的镜像名称和tag
  • --network=host 用于制定构建过程中使用宿主机的网络连接,在构建过程中如果需要联网,需要设置该选项

你可能感兴趣的:(计算机基础)