阿里华为Dockerfile命令规范及最佳实践(下)

简介: 阿里华为Dockerfile命令规范及最佳实践

4 WORKDIR

类似 linux 的cd 命令。

1. WORKDIR /test # 如果没有会自动创建test目录
2. WORKDIR demo
3. RUN pwd # 输出结果应为/test/demo

最佳实践

使用WORKDIR,不要用 RUN cd

尽量使用绝对目录而非相对目录。

5 ADD & COPY

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:

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

[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,区别:

  • ADD 的优点
    在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点
    在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
ADD hello /
# 添加到根目录并解压
ADD test.tar.gz / 
WORKDIR /root
ADD hello test/  # /root/test/hello
WORKDIR /root
COPY hello test/

最佳实践

大部分情况,COPY优先于ADD

ADD比COPY多个解压功能

添加远程文件/目录请使用curl或者wget

6 ENV

ENV MYSQL VERSION 5.6 # 设置常量RUN apt-get install -y mysql-server= "$(MYSQL_VERSION]" \
    && rm -rf /var/lib/apt/lists/* # 引用常量

最佳实践

尽量使用,可增加项目的可维护性。

7 上下文路径

指令最后一个 . 是上下文路径

  • 上下文路径
    指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。


上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

VOLUME & EXPOSE

存储和网络

CMD & ENTRYPOINT

实战

  • 项目源码
  • image.png
  • python app.py
  • image.png
  • image.png
  • 如何调试Dockerfile?
  • 比如执行到如下步骤时报错
  • image.png
  • 那就进入该临时中转镜像即可
docker run -it 4320f8b526bc /bin/bash

进入后,直接查看 app,原来是个文件,并非路径!检查下 Dockerfile

image.png

注意那行意思是将 app.py 放到根目录下并命名为 app,所以它不是个目录。

image.png

之后再 build,run 即可。

参考

目录
相关文章
|
3月前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
256 69
|
Kubernetes Cloud Native Devops
【云原生|实战研发】3:Docker命令全集一览
本期文章是Docker文章指令大全,上次的文章中我们已经学习过了Pod详细解析、Docker、K8s的核心概念理解与简单的代码实战相关知识,也学习了DevOps与微服务的概念,感兴趣的同学可以去我的云原生专栏中学习,任意门:云原生学习专栏
|
缓存 JavaScript Ubuntu
纯干货!构建Dockfile镜像的十三个最佳实践点
编写.dockerignore文件 构建镜像时,Docker需要先准备上下文 ,将所有需要的文件收集到进程中。默认的上下文包含Dockerfile目录中的所有文件,但是,实际上我们并不需要.git目录,.vscode目录、.idea目录等内容。 .dockerignore 的作用和语法类似于 .gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少Docker镜像的大小。
|
Ubuntu Shell Linux
阿里华为Dockerfile命令规范及最佳实践(上)
阿里华为Dockerfile命令规范及最佳实践
172 0
阿里华为Dockerfile命令规范及最佳实践(上)
|
存储 Web App开发 自然语言处理
一种设想:在网盘里coding,debuging,运行linux rootfs作全面devops及一种基于分离服务为api的融合appstack新分布式开发设想
本文关键字:Jupyter visual debug,基于网盘backend的ide和snippter空间,debug driven programming,make chrome like visual debug for every lanaguage,make every language a dsl,c系语言学习最好的时代
324 0
一种设想:在网盘里coding,debuging,运行linux rootfs作全面devops及一种基于分离服务为api的融合appstack新分布式开发设想
|
Prometheus Kubernetes 监控
|
Kubernetes 安全 调度
K8S 生态周报 | 首个 Docker 官方 Action 发布
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 首个 Docker 官方 GitHub Action 发布了 从去年 Docker 将企业服务相关的业务出售给 Mirantis 之后,Docker 将重心放在助力开发者体验上,并为此做了一系列的努力。
|
Prometheus Cloud Native Docker
开源应用 Docker App 加入 CNAB 规范,实现云原生应用的统一管理
Docker App 是我们在2018 DockerCon 美国大会上简要介绍的一款新工具。我们一直致力于“Docker APP”的开发,使容器应用程序更易于在不同团队和不同环境之间共享和管理......
2513 0
|
Ubuntu Linux Shell
阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品
Docker简介 Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。 Docker基于Go语言开发,代码托管在Github上,目前超过10000次commit。
2385 0
|
JavaScript 测试技术 网络安全
Docker 社区版 18.09 开放测试,全新内容先睹为快!
几周前,我们宣布了将 Docker 社区版(CE)引擎的维护周期进行更改。作为这些更改的一部分,我们正在进行 beta 测试,以向市场提供更高质量的引擎。
3669 0