使用Dockerfile来创建快速镜像
首先创建一个Dockerfile,包含一些创建镜像的指令;使用docker build来创建新的像。 创建一个目录和一个Dockerfile,该目录包含你的代码和需要的文件。
. ├── client.py ├── Dockerfile ├── README.md └── service
FROM FROOM 指定基础镜像,必须为第一个命令 RUN 构建镜像时运行的命令 ADD 添加文件到容器,tar类型文件会自动解压,可以访问网络资源,如wget等 ENV 设置环境变量 COPY 功能类似ADD,但是不会自动解压文件,也不能访问网络资源 WORKDIR 工作目录,类似于cd命令,chdir() USER 指定容器运行时的用户名或UID EXPOSE 暴露应用程序运行所需的端口 CMD 构建镜像后调用,也是在容器启动时才调用
基本语法: FROM <image>[:<tag>]
image 表示你想要使用的镜像名称。
tag(可选)是特定版本的标识符,默认为 latest,即如果没有指定标签,则会使用最新版的基础镜像。
一般是为了安装一些容器中安装所需安装包和依赖
基本语法: RUN <command>
command 命令将在一个 shell 中运行,默认情况下是 /bin/sh -c 在 Linux 或者 cmd /S /C 在 Windows。可以使用链式命令
RUN apt-get update && apt-get install -y \ package-bar
RUN ["executable", "param1", "param2"]
基本语法: ADD <src>... <dest> 或者 json格式 ADD ["<src>",... "<dest>"]
src 表示源文件或目录,可以是相对路径(相对于构建上下文),也可以是绝对路径,甚至是一个远程文件 URL。
dest 目标路径是指定在容器内部的路径,可以是绝对路径,也可以是相对于 WORKDIR 的相对路径。
ADD ./local-directory /app/data
基本语法: ENV <key>=<value>
ENV MY_NAME="John Doe"
ENV MY_NAME="John Doe" MY_YEAR="Ten Year Old"
ENV SOURCE_DIR=/path/to/source COPY ${SOURCE_DIR} /app/
docker run --rm myimage printenv MY_NAME
基本语法: COPY <src>... <dest> 或者 json格式 COPY ["<src>",... "<dest>"]
src 表示源文件或目录路径,可以是相对路径(相对于 Dockerfile 所在的目录),也可以是绝对路径。
dest 表示目标路径,指的是容器内部的位置。它可以是绝对路径,也可以是相对于 WORKDIR 的相对路径。
COPY ./local-directory /app/data
基本语法: WORKDIR <path>
path 是容器内部的工作目录路径。它可以是相对路径或绝对路径。如果是相对路径,则它是相对于上一个 WORKDIR 指令设置的路径
基本语法: USER <user>[:<group>] 或者 基本语法: USER <UID>[:<GID>]
user 可以是用户名或用户ID(UID)。
group 可选,可以是组名或组ID(GID),当指定组时需要用冒号 : 分隔用户名和组名。
EXPOSE <port> [<port>/<protocol>...]
port:可以是一个或多个端口号。
protocol:可选参数,指定协议(TCP 或 UDP)。默认情况下,Docker 使用 TCP 协议。
EXPOSE 80 EXPOSE 80/tcp EXPOSE 53/udp EXPOSE 80 443 EXPOSE 80/tcp 443/tcp
格式 CMD "python" "/yolov5ship/track_vv.py" 传入多个参数 CMD ["executable","param1","param2"] CMD ["python","/yolov5ship/track_vv.py","--port=5000"] CMD ["param1","param2"] CMD command param1 param2 执行多个命令 1、CMD command1&&command2&&command3 2、CMD command1;command2;command3
在创建的文件夹目录下运行打包程序
docker build -t hello-docker-image:V1.0 .
-t 参数指定构建成后,镜像的仓库、标签等
# FROM 指定基础镜像,必须为第一个命令 FROM anibali/pytorch:1.8.1-cuda11.1-ubuntu20.04 # 设置时区 ENV TZ=UTC RUN sudo ln -snf /usr/share/zoneinfo/$TZ /etc/localtime # shell执行(内部执行) RUN sudo apt-get update \ && sudo apt-get install -y libgl1-mesa-glx libgtk2.0-0 libsm6 libxext6 \ && sudo rm -rf /var/lib/apt/lists/* # 安装python程序运行程序的所有依赖 RUN python -m pip install --upgrade --no-cache-dir --ignore-installed -i https://mirrors.aliyun.com/pypi/simple \ flask==0.12.2 \ RUN python -m pip install --upgrade --no-cache-dir --ignore-installed --no-deps -i https://mirrors.aliyun.com/pypi/simple timm==0.3.2 #指定容器运行时的用户名或UID USER root #设置环境变量 ENV WORKPATH="/workspace" ENV DEVICE="cuda:0" ENV LC_ALL=C.UTF-8 \ LANG=C.UTF-8 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' > /etc/timezone # 创建工作目录 RUN sudo mkdir -p ${WORKPATH} # 将当前路径的文件复制到容器内对应的目录下 COPY ./ ${WORKPATH} # 切换到工作目录 WORKDIR ${WORKPATH} # 进入服务代码所在的路径 WORKDIR ${WORKPATH}/service # 构建镜像后调用,也是在容器启动时才调用,即通过gunicorn启动服务 CMD gunicorn -c gunicorn.conf.py --log-config log.conf app:app
注
文章如有错误,还望留言指正
参考资料
特殊原因,不便展示,请见谅