【Docker】dockerfile学习

这篇具有很好参考价值的文章主要介绍了【Docker】dockerfile学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Dockerfile是一个包含用于组合映像的命令的文本文档。
可以使用在命令行中调用任何命令。
Docker通过读取Dockerfile中的指令自动生成映像。
LinuxCentos中运行代码是会print到控制台的

一、Dockerfile文件说明

Dockerfile 一般分为四部分:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

#为 Dockerfile 中的注释符号,一个声明以#字符开头则被视为注释。

FROM

Docker以从上到下的顺序运行Dockerfile的指令。
为了指定基本映像,第一条指令必须是FROM。

格式:

  FROM <image>

  FROM <image>:<tag>

  FROM <image>@<digest>

示例:

  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

RUN

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

  1. shell执行格式:
RUN <command>

示例

RUN apk update
  1. exec执行格式:
RUN ["executable", "param1", "param2"]

示例:

RUN ["/etc/execfile", "arg1", "arg1"]

注:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache

WORKDIR

在Dockerfile中,WORKDIR指令用于为后续的指令设定工作目录。通过使用WORKDIR指令,可以指定在构建镜像过程中执行命令的目录。这使得在构建镜像时,可以在指定的目录中执行RUN、CMD、ENTRYPOINT、COPY和ADD等指令。

WORKDIR指令的作用是持久性的,即在构建镜像的每一层中都存在,而不仅仅是作用于当前层。在Dockerfile文件中,WORKDIR指令可以出现多次,而且路径可以是相对路径,但它的路径是相对此前一个WORKDIR指令指定的路径。

此外,WORKDIR指令还可以用于切换后续命令执行的用户。在USER命令之前可以使用RUN命令创建需要的用户,然后在USER命令中切换到该用户执行后续命令。

ADD

命令ADD将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:

ADD <src>... <dest> # 其中<src>是被复制的文件与文件夹, <dest>是文件复制到的目的地

ADD ["<src>",... "<dest>"] 用于支持包含空格的路径示例:

ADD hom* /mydir/ # 添加所有以"hom"开头的文件

ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"

ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/

ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/

示例

ADD ./* /scraper/

将当前目录下的所有文件和文件夹复制到Docker镜像中的/scraper/目录下。其中,.表示当前目录,/*表示匹配当前目录下的所有文件和文件夹,/scraper/表示将文件复制到镜像中的目标路径。

COPY

COPY功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

ENV

ENV设置环境变量
格式:

ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量

ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行

示例:

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat=fluffy

二、例子解析

RUN apt update && apt install sudo && sudo apt update && sudo apt install --yes python3.9-distutils wget git

这段命令 RUN apt update && apt install sudo && sudo apt update && sudo apt install --yes python3.9-distutils wget git 在一个Dockerfile中具体进行了以下操作:

  1. apt update: 更新可用软件包列表。
  2. apt install sudo: 安装sudo命令行工具。
  3. sudo apt update: 使用sudo权限再次更新可用软件包列表。
  4. sudo apt install --yes python3.9-distutils wget git: 使用sudo权限安装python3.9-distutils、wget和git这三个软件包。

&&是shell中的逻辑运算符,表示只有左边的命令执行成功,右边的命令才会被执行。在Dockerfile中,RUN命令后面的所有命令都会在新的shell中执行,因此&&可以保证只有前一个命令成功,后一个命令才会被执行。

RUN wget --quiet https://mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /miniconda && rm ~/miniconda.sh

这段Dockerfile的命令执行以下操作:

  1. wget --quiet url.sh -O ~/miniconda.sh: 使用wget工具,静默下载从指定URL(这里是mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh)的脚本文件,并将其保存到用户主目录下,命名为miniconda.sh。
  2. /bin/bash ~/miniconda.sh -b -p /miniconda : 使用/bin/bash命令运行刚才下载的miniconda.sh脚本,以便进行安装。注意,这里的-b选项表示要生成一个基本的安装,-p选项指定了安装路径(这里是/miniconda)。
  3. rm ~/miniconda.sh: 最后,删除已经运行过的miniconda.sh脚本文件,以清理工作空间。

这段命令的主要目的是在Docker镜像中安装Miniconda Python发行版。Miniconda是一个小型的Python发行版,它包含了Python、pip以及一些常用的科学计算库。它通常用于在Linux环境下进行科学计算和数据分析。

ENV PATH=/miniconda/bin:$PATH

在Dockerfile中使用ENV指令可以定义环境变量。在这个例子中,PATH=/miniconda/bin:$PATH定义了一个名为PATH的环境变量,其值设置为/miniconda/bin和现有的$PATH值的组合。

这样做是为了将Miniconda的路径添加到系统的环境变量中,以便在容器中运行Miniconda相关的命令。通过将Miniconda的路径添加到PATH环境变量中,容器内的其他命令或脚本可以轻松地访问并使用Miniconda。

$PATH表示现有的环境变量值,因此这行命令将Miniconda的路径添加到现有的$PATH中,而不仅仅是覆盖它。

RUN . /root/.bashrc && /miniconda/bin/conda init bash && conda install pycurl=7.45.1

这条命令做了以下几件事:

  1. RUN . /root/.bashrc: 运行 /root/.bashrc 文件。.bashrc 是一个bash shell的配置文件,通常用于设置环境变量或者定义别名等。这行命令可能是为了设置一些环境变量或者配置。
  2. RUN /miniconda/bin/conda init bash: 运行 conda init bash,这是初始化conda bash shell的命令。它将conda的命令添加到bash shell的初始化脚本中,这样每次开启新的bash shell时,都能自动运行conda的初始化命令。
  3. RUN conda install pycurl=7.45.1: 运行 conda install pycurl=7.45.1,这是使用conda安装pycurl的命令。这个命令会从conda的包管理器中下载并安装指定版本的pycurl包。

注意,这些命令都是在Dockerfile中的RUN指令下执行的,每次执行RUN指令,Docker都会新建一个层并执行该指令,然后提交为新的镜像层。所以,如果你的Dockerfile中有多个RUN指令,那么它们将在新的一层中依次执行。

三、构建Dockerfile实例

构建Docker镜像,简单来说分为以下两种:

  • 拉取CentOS的操作系统镜像并生成容器,然后在里面安装各种需要的环境,诸如SSH、Python等。好处就是容器内东西够多,几乎就是又一台服务器,想怎么玩都行。坏处就是吃机子服务器的性能,以我之前的某次作死为例,光镜像文件就得四个G,哪怕是备份文件也得七百兆起步。

  • 直接拉取Python镜像,简单粗暴,当然,也是需要自己手动安装各种环境的。好处就是容器偏小,备份和恢复起来较为方便。

(FROM ubuntu:20.04)部署一整套的系统和目标软件

FROM ubuntu:20.04

# 配置miniconda的环境
RUN apt update && apt install sudo && sudo apt update && sudo apt install --yes python3.9-distutils wget git

RUN wget --quiet https://mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /miniconda && rm ~/miniconda.sh
ENV PATH=/miniconda/bin:$PATH
RUN . /root/.bashrc && /miniconda/bin/conda init bash && conda install pycurl=7.45.1

# 配置文件系统和系统依赖
WORKDIR /scraper
ADD ./* /scraper/

RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple
RUN pip install --upgrade pipenv -i https://mirrors.aliyun.com/pypi/simple
ENV PIPENV_VENV_IN_PROJECT=1

(FROM python:3.7)专注于Python应用的快速部署

 #基础镜像   
FROM python:3.7
# 设置工作目录文件夹   
WORKDIR /code      
# 复制依赖文件   
COPY requirements.txt requirements.txt      
# 安装依赖   
RUN pip install -r requirements.txt
# 复制其他的脚本文件   
COPY keen_test.py keen_test.py      #当启动容器时候,执行change_step.py程序   
CMD ["python", "keen_test.py"]   

(FROM ubuntu:20.04) 与 (FROM python:3.7)的区别

第一个Dockerfile也就是FROM ubuntu:20.4类型,是为了在一台电脑上部署一整套的系统和目标软件。它使用了ubuntu:20.04作为基础镜像,这意味着它会从Ubuntu操作系统的官方镜像开始构建,并在此基础上安装所需的软件和库。通过配置Miniconda环境和安装Python 3.9的相关工具,这个Dockerfile提供了一个全面的开发环境,适合于需要进行系统级配置和管理的应用场景。

第二个Dockerfile也就是FROM python3.7类型,则是为了已经在运行某个操作系统的电脑上部署Python应用。它使用了python作为基础镜像,这通常指的是Python官方的Alpine镜像,因为它体积小巧且高效。这个Dockerfile专注于Python应用的打包和运行,直接将应用程序文件复制到镜像中,并指定了Python应用的入口点。这种方法非常适合快速开发和部署简单的Python应用,尤其是那些没有复杂系统级依赖的应用。

简而言之,第一个Dockerfile提供了一个完整的开发和运行环境,适合于需要进行系统级配置和管理的情况;而第二个Dockerfile则更加轻量级,专注于Python应用的快速部署,适合于已有操作系统环境的电脑。

四、运行 Dockerfile

构建镜像 docker build

对应的Dockerfile文件直接命名为Dockerfile文件即可
使用以下命令在工作目录中构建Docker镜像:

docker build -t python-docker-demo .

.当运行docker build命令时,需要提供一个上下文路径(context path),这是Docker用来查找Dockerfile和相关文件的目录。如果没有提供上下文路径,Docker默认使用当前目录作为上下文路径。
在这种情况下,点.代表当前目录。所以,docker build -t python-docker-demo .的含义是:在当前目录下查找Dockerfile和其他相关文件,并基于这些信息构建一个名为python-docker-demo的镜像。

-t 标志是用来给新构建的镜像打标签的。

运行容器 docker run

构建完成后,可以运行该镜像。使用以下命令运行容器:

docker run python-docker-demo

此命令将启动一个容器。控制终端会输出对应的程序内容。

五、错误处理

重启docker是首选项

参考

service docker restart

反正也不耗时间,可以经常重启docker

FileNotFoundError: [Errno 2] No such file or directory

参考
参考

使用文件夹路径作为源,而不是使用通配符

如果想复制整个文件夹到镜像中,需要使用文件夹路径作为 COPY 指令的源。例如:

COPY myfolder /app/

在上述例子中,myfolder 文件夹及其所有内容将被复制到容器内的 /app/ 路径下。
也就是说调整Dockerfile的位置从:

-folder1
|   |-folder3
|   |-file.txt
|
-folder2
|
|
|-Dockerfile

改为:

|-更上一级的folder
|   |-folder1
|       |-folder3
|       |-file.txt
|   |-folder2
|
|
|
|-Dockerfile

请注意,COPY 指令的行为会根据你提供的源路径和目标路径的不同而有所不同。
如果你想要复制整个文件夹,你需要使用文件夹路径作为源,而不是使用通配符。

https://baijiahao.baidu.com/s?id=1765200652242703024&wfr=spider&for=pc
https://www.jb51.net/python/306983mkz.htm
https://www.cnblogs.com/sweetorangezzz/articles/16733424.html
2024-2-18 01:36成功在centos创建了项目容器,并运行成功,高兴文章来源地址https://www.toymoban.com/news/detail-830808.html

到了这里,关于【Docker】dockerfile学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker容器---dockerfile简介

    1、dockerfile介绍 dockerfile是自定义镜像的一套规则,dockerfie由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(

    2023年04月23日
    浏览(49)
  • 【Docker】Docker容器数据卷、容器卷之间的继承和DockerFIle的详细讲解

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C++、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL,感兴趣的小伙伴可以看看。 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️万物从心起,心动则万物动🏄

    2024年02月14日
    浏览(40)
  • Docker容器与虚拟化技术:Docker镜像创建、Dockerfile实例

    目录 一、理论 1.Docker镜像的创建方法 2.Docker镜像结构的分层 3.Dockerfile 案例 4.构建Systemctl镜像(基于SSH镜像) 5.构建Tomcat 镜像 6.构建Mysql镜像 二、实验 1.Docker镜像的创建 2. Dockerfile 案例 3.构建Systemctl镜像(基于SSH镜像) 三、问题 1.nginx网页打不开  2.Apache容器启动一直为Ex

    2024年02月12日
    浏览(62)
  • Docker容器:docker数据管理、镜像的创建及dockerfile案例

    因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在;还有一种方式,容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。 管理 Docker 容器中数据主要有两种方式:数据卷(

    2024年02月12日
    浏览(52)
  • Docker容器化技术(使用Dockerfile制作镜像)

    Docker 支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。 1、Docker 镜像为什么分层 镜像分层最大的一个好处就是共享资源。 比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在

    2024年03月19日
    浏览(131)
  • docker容器:docker镜像的三种创建方法及dockerfile案例

    目录 一、基于现有镜像创建 1、创建启动镜像 2、生成新镜像 二、基于本地模板创建  1、OPENVZ 下载模板 2、导入容器生成镜像 三、基于dockerfile创建  1、dockerfile结构及分层 2、联合文件系统 3、docker镜像加载原理 4、dockerfile操作常用的指令 (1)FROM指令 (2)MAINTAINER 指令 (3)RUN指令

    2023年04月20日
    浏览(54)
  • (三)docker:Dockerfile构建容器运行jar包

    目录结构以及准备的文件 2.Dockerfile内容 3.构建镜像 4.查看生成镜像 5.创建并运行容器 6.查看创建的容器 7.启动画面确认

    2024年02月06日
    浏览(39)
  • 【Docker】如何编写Dockerfile,深入理解 Dockerfile:构建精简且高效的容器镜像

    Docker 是一种轻量级的容器化技术,使得应用程序和它们的依赖可以被打包到一个容器中,方便在不同环境中运行。Dockerfile 是用于定义 Docker 镜像的文本文件,其中包含了一系列的指令,这些指令描述了镜像中应该包含哪些内容和如何配置。 在开始编写 Dockerfile 之前,确保你

    2024年01月24日
    浏览(52)
  • Docker进阶:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月09日
    浏览(52)
  • Docker基础入门:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包