docker使用杂记-最佳实践尝试-实战(代码片段)

licsber licsber     2023-04-12     755

关键词:

Docker 使用杂记 - 最佳实践尝试 - 实战

本文记录了一个项目中使用docker构建环境的过程

Docker简介

Docker NB!好了 其他简介自己看网上吧

技术图片

项目背景

内在原因

这次的代码基于一个特定的tensorflow版本构建(才不是tf2跑不起来呢!

外在原因

与别人分享代码的时候就可以不用告诉他怎么一步步配置环境了

并且基于GPU的Docker镜像可以由nvidia-docker直接运行

基础镜像

FROM

需求

Tensorflow==1.14

CUDA==10.0

cuDNN==7.4

openCV==3.4.2.16

俗话说好的开始是成功的一半

这次的基础镜像就由tensorflow官方搭的镜像为基础

看了一圈选择了tensorflow/tensorflow:1.14.0-gpu-py3

地址在这tensorflow:1.14.0-gpu-py3

挺不错 自带GPU支持 要构建其他镜像的同学也可以在tags里面搜索即可 全都有

镜像维护者

LABEL

这里是说的MAINTAINER这个标签 但是我刚敲出来 就发现 过期了(deprecated

上网一搜发现解决方案是用LABEL

最佳实践:

LABEL maintainer="Licsber <Licsber@njit.edu.cn>"

工作文件夹

WORKDIR

顾名思义 制定容器内默认的文件夹

不指定的话默认就是/根目录

WORKDIR /home

文件

ADD

ADD的好处是tar.gz文件可以自动解压

并且ADD可以从网络路径拷贝文件

任何情况下尽量不使用ADD(因为各种奇怪行为

COPY

顾名思义 COPY:拷贝文件

语义明确 推荐使用

注意目标地址一定要是一个目录(不然报错

源地址拷贝会自动相当于有一个/*的拷贝

于是乎造成的特性就是只拷贝文件夹内的内容

COPY sources.list /etc/apt/

COPY model /home/model/

COPY *.py /home/

另外的特性就是可以使用通配符(符合Go语法即可(GoNB

宗卷

VOLUME

设置宗卷之后可以使用外置环境的内容了

VOLUME /data

挂载的方式:在docker run后面带上参数

-v $源路径:$宗卷名称切记别反了(我第一次就反了 debug半天

例如:

sudo docker run -v /Users/licsber/Download:/data $项目名称

这样在镜像内/data就能访问到外置环境了 方便保存结果 读取文件

命令

RUN

RUN用于运行命令

最佳实践:

RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y &&     pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip &&     pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple 

新手会把RUN命令写多个 但是每一个Docker命令都会新建一层

这样会让层数特别多 于是 如果只是为了构建环境 一句话就够

入口点

ENTRYPORT

CMD命令差不多

区别就是不会被默认替换

如果只定义CMD 空参数运行默认执行CMD里的内容

如果只定义CMD 带参数运行会覆盖CMD定义的命令

ENTRYPOINT ["python", "main.py"]

这样镜像名:tag后面的参数就会默认追加到入口点了

CMD

另外需要注意的就是Docker没有后台的概念

如果在里面写这样:

CMD service nginx start

会发现容器秒退 因为Docker是容器 具体解释参见CMD容器启动命令

Dockerfile

okk 看完了前面 终于到了重点

把这些命令一行行码好 放到一个Dockerfile

就可以build

build之后 run push 之类的操作岂不是顺手拈来

另外可以看看阿里天池的Docker训练 也能摸索tag的使用方法

还有关于tag的一个小坑 latest 这个自己谷歌吧

完整的Dockerfile贴在这:

FROM tensorflow/tensorflow:1.14.0-gpu-py3

LABEL maintainer="Licsber <Licsber@njit.edu.cn>"

WORKDIR /home
VOLUME /data

COPY sources.list /etc/apt/

RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y &&     pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip &&     pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple 

COPY model /home/model/

COPY *.py /home/

ENTRYPOINT ["python", "Retargeting.py"]

后记

话说loop: 改代码 -> build同一个tag -> 运行是不是最佳实践呀?

实测产生大量<none> 需要手动删除

这里贴出来一键代码:清理无用的docker镜像

alias dclean='sudo docker rmi $(docker images -f "dangling=true" -q)'

没错 我就是电脑里定义了100+alias的小天才(逃

本文环境

Docker engine==19.03.5

技术图片

参考

Docker — 从入门到实践

Docker MAINTAINER Instruction

mongo实战之数据空洞的最佳实践(代码片段)

...Size并不会变小,这就造成了大量的数据空洞。解决办法1.使用MongoDB自带的compact命令:db.collectionName.r 查看详情

java并发编程实战-创建和执行任务的最佳实践(代码片段)

若无法通过并行流实现并发,则必须创建并运行自己的任务。运行任务的理想Java8方法就是CompletableFuture。Java并发的历史始于非常原始和有问题的机制,并且充满各种尝试的优化。本文将展示一个规范形式,表示创建... 查看详情

dockerfile最佳实践(代码片段)

Dockerfile简介Docker通过读取Dockerfile文件中的指令自动构建镜像。Dockerfile文件为一个文本文件,里面包含构建镜像所需的所有的命令。Dockerfile文件遵循特定的格式和指令集Docker镜像由只读层组成,每个层都代表一个Dockerfile指令。... 查看详情

vue开发实战生态篇#18:vuex最佳实践(代码片段)

说明【Vue开发实战】学习笔记。核心概念State一this.$store.state.xxx取值——mapState取值Getter一this.$store.getters.xxx取值——mapGetters取值Mutation一this.$store.commit("xxx")赋值——mapMutations赋值Action一this.$store.dispatch(" 查看详情

实战flyway迁移指南最佳实践(代码片段)

项目在多环境迭代开发过程中,数据库的表结构不断变更,在部署时,往往会出现数据库表结构未及时变更导致出现问题,耗费在表结构上的时间相当多,上线过程持续痛苦,代码有GIT/SVN来控制,数据库中的表版本也可以做到... 查看详情

sparksql下的parquet使用最佳实践和代码实战

一:Spark SQL下的Parquet使用最佳实践1,过去整个业界对大数据的分析的技术栈的Pipeline一般分为一下两种方式:A)DataSource->HDFS->MR/Hive/Spark(相当于ETL)->HDFSParquet->SparkSQL/impala->ResultService(可以放在DB中,也有可能被通... 查看详情

sparksql下的parquet使用最佳实践和代码实战

一:SparkSQL下的Parquet使用最佳实践1,过去整个业界对大数据的分析的技术栈的Pipeline一般分为一下两种方式:A)DataSource->HDFS->MR/Hive/Spark(相当于ETL)->HDFSParquet->SparkSQL/impala->ResultService(可以放在DB 查看详情

.netcore开发实战(定义api的最佳实践)sourcegenerators版(代码片段)

...me.geekbang.org/course/detail/100044601-201165)介绍了定义API的最佳实践。大意如下:Controller这一层负责与前端用户的交互,它主要的责任就是定义输入和输出, 查看详情

es最佳实践配置(代码片段)

...云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。作为一个开箱即用的产品,在生产环境上线之后,我们其实不一定能确保其的性能和稳定性。如何根据实际情况提高服务的性能,其实有很多技巧。这章我们分... 查看详情

3.docker技术入门与实战---使用docker镜像(代码片段)

第3章 使用Docker镜像 镜像是docker三大核心概念中最重要的,docker运行容器前需要本地存在对应的镜像,如果镜像不存在,docker会尝试先从默认镜像仓库下载(默认使用DockerHub公共注册服务器中的仓库),用户也可以通过配置,使... 查看详情

猿创征文|国产数据库实战之使用docker部署oceanbase数据库(代码片段)

猿创征文|国产数据库实战之使用Docker部署OceanBase数据库一、OceanBase介绍1.OceanBase介绍2.OceanBase特点3.OceanBase数据库基础概念4.OceanBase相关概念①OBServer②区域(zone)③资源池④租户⑤数据分区⑥副本5.本次实践介绍二、检查... 查看详情

从 docker 堆栈运行 cron 作业的最佳实践

】从docker堆栈运行cron作业的最佳实践【英文标题】:Bestpracticestoruncronjobfromadockerstack【发布时间】:2018-10-0404:19:20【问题描述】:事情是这样的:我有一个堆栈,其中节点js后端将消息发送到队列,perl工作人员(cron作业)使用... 查看详情

为啥Docker官方镜像不按照“最佳实践”的要求使用USER

】为啥Docker官方镜像不按照“最佳实践”的要求使用USER【英文标题】:WhydoDockerofficialimagesnotuseUSERasrequiredby"bestpractices"为什么Docker官方镜像不按照“最佳实践”的要求使用USER【发布时间】:2016-03-2117:34:29【问题描述】:P... 查看详情

dockerfile最佳实践(代码片段)

Dockerfile最佳实践本文是Docker官方文档docs/archive:v1.1中BestpracticesforwritingDockerfiles的理解和翻译。包含了Docker官方对编写Dockerfile的最佳实践和建议。这些建议是为了让你写出高效易用的Dockerfile。Docker官方强烈建议你遵从这些建议&#x... 查看详情

php小部件最佳实践:使用函数(代码片段)

查看详情

docker安装(代码片段)

Jumpserver封装了一个AllinoneDocker,可以快速启动。该镜像集成了所需要的组件,支持使用外置Database和RedisTips:不建议在生产中使用,因为所有软件都打包到一个Docker中了,不是Docker最佳实践生产环境部署建议参考 进阶安装文档快速... 查看详情

ddd实战进阶第一波:开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)(代码片段)

...讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题。大家都知道,聚合根、实体和值对象这些领域对象都自身处理自己的业务逻辑。在业务处理过程中,通常会有一些条件判断,当满足这些条件时,会进行不... 查看详情

spring事务使用最佳实践(代码片段)

...式事务实现1.3.2、声明式事务实现1.3.3、Spring声明式事务使用注意事项2、事务问题治理2.1、大事物的危害2.1.1事务问题原因分类2.1.2、大事物带来的潜在风险2.2、治理方案1Spring事务最佳实践1.1、Spring事务传播机制Spring定义了七种... 查看详情