【Docker】dockerfile学习

目录

  • 一、Dockerfile文件说明
    • FROM
    • RUN
    • WORKDIR
    • ADD
    • COPY
    • ENV
  • 二、例子解析
  • 三、构建Dockerfile实例
    • (FROM ubuntu:20.04)部署一整套的系统和目标软件
    • (FROM python:3.7)专注于Python应用的快速部署
    • (FROM ubuntu:20.04) 与 (FROM python:3.7)的区别
  • 四、运行 Dockerfile
    • 构建镜像 docker build
    • 运行容器 docker run
  • 五、错误处理
    • 重启docker是首选项
    • FileNotFoundError: [Errno 2] No such file or directory

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 DoeENV myDog Rex The DogENV 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 gitRUN 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创建了项目容器,并运行成功,高兴

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中下载静态资源里的pdf文件

1.把文件放在项目目录src/assets文件下 2.在项目是用a标签下载 <a:href"require(/assets/download.pdf)"download"使用说明.pdf"target"_blank"><img src"/assets/banner.png" class"bannerimg"/></a> 以…

【xv6-labs】02 Lab: system calls

GDB 如何启动gdb 启动 make CPUs1 qemu-gdb在另一个终端启动 gdb-multiarch kernel/kernel进入gdb后输入 target remote localhost:26000 GDB 的一些命令 shell clear # 清屏layout src # 显示源码layout regs # 显示寄存器layout split # 同时显示源码和寄存器backtrace #…

Transformer实战-系列教程15:DETR 源码解读2(整体架构:DETR类)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1&#xff08;项目配置/CocoDetection类/ConvertCocoP…

什么是485远程水表?

485远程水表是一种利用RS485通信协议进行数据传输的智能水表&#xff0c;它具有远程读数、实时监控、数据存储等功能&#xff0c;为水资源管理和居民用水提供了便捷。在我国&#xff0c;随着物联网、大数据等技术的发展&#xff0c;485远程水表得到了广泛的应用&#xff0c;为智…

引领企业服务新篇章,纷享销客揽获4项大奖

近日&#xff0c;连接型CRM的开创者纷享销客&#xff0c;凭借其卓越的整体实力&#xff0c;分别荣获《互联网周刊》&eNet研究院“2023年度最佳企业服务产品奖”、携手盈建科荣获中国工业报社“数字化转型优秀案例”、入选产业家“2023产业数字化金铲奖”以及KVBrand“2023年…

BUUCTF第二十二、二十三题解题思路

第二十二题[WUSTCTF2020]level1 查壳 64位ELF文件&#xff0c;用64位IDA打开。 在函数界面可以看到一个“flag”&#xff0c;跟进该函数。 int __cdecl main(int argc, const char **argv, const char **envp) {int i; // [rsp4h] [rbp-2Ch]FILE *stream; // [rsp8h] [rbp-2…

Java项目中,值的对应问题

数据库表 实体类&#xff08;对应数据库的字段&#xff0c;可以驼峰命名&#xff09; 封装的查询方法sql List<Student> getAllStudents(String name,String studentId,Integer classId,String className); 这里的值一一对应。 在多表查询时&#xff0c;查询到的指定字段…

备战蓝桥杯 Day3

目录 搜索与回溯 1222&#xff1a;放苹果 1221&#xff1a;分成互质组 1218&#xff1a;取石子游戏 数组 1126&#xff1a;矩阵转置 1127&#xff1a;图像旋转 1128&#xff1a;图像模糊处理 1120&#xff1a;同行列对角线的格 string 2046&#xff1a;【例5.15】替换…

JAVA高并发——核心知识点

文章目录 1、重要概念1.1、同步(Synchronous)和异步(Asynchronous)1.2、并发(Concurrency)和并行(Parallelism)1.3、临界区1.4、阻塞(Blocking)和非阻塞(Non-Blocking)1.5、死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock)1.6、并发级别1.6.1、阻塞1.6.2、无饥饿(Starvation…

2011-2022年上市公司ESG表现、制造业高质量发展与数字化转型原始数据计算结果do代码

2011-2022年上市公司ESG表现、制造业高质量发展与数字化转型 原始数据(exceldta)计算结果do代码 参照王丹&#xff08;2023&#xff09;的做法&#xff0c;对来自统计与决策《ESG表现、制造业高质量发展与数字化转型》一文中的基准回归部分进行复刻&#xff1a; 1、数据时间&a…

java 单例模式

单例模式是最简单的设计模式之一。即一个类负责创建自己的对象&#xff0c;同时确保只有单个对象被创建&#xff0c;提供一种访问其唯一的对象的方式&#xff0c;可以直接访问&#xff0c;不需要实例化该类的对象。 1、懒汉式&#xff0c;线程不安全 public class Singleton …

两个发散级数的和是否发散?

1、两个发散级数的和可能是收敛的也可能是发散的。 例子&#xff1a; 发散级数 ∑ 1 n \sum\frac{1}{n} ∑n1​和发散级数 ∑ ( 1 n 2 − 1 n ) \sum(\frac{1}{n^{2}}-\frac{1}{n}) ∑(n21​−n1​)的和是收敛级数&#xff1b; 发散级数∑(1/n) 和发散级数 ∑(1/n1/n) 的和是…

为什么你用的redis没有出现雪崩,击穿,穿透

一、前言 在大规模并发访问系统中&#xff0c;如果你的系统用到redis&#xff0c;在面试的时候面试官往往会问你的系统有没有出现雪崩&#xff0c;击穿&#xff0c;穿透这样的场景&#xff0c;然后是怎样解决的。博主也经常反复温习redis的特性&#xff0c;总是被雪崩&#xf…

不懂咱就学,记不住多看几遍(二)

一、Redis分布式锁中加锁与解锁、过期如何续命 实现要点&#xff1a; 互斥性&#xff0c;同一时刻&#xff0c;只能有一个客户端持有锁。防止死锁发生&#xff0c;如果持有锁的客户端因崩溃而没有主动释放锁&#xff0c;也要保证锁可以释放并且其他客户端可以正常加锁。加锁和…

请解释 C++ 中的析构函数,并说明它们的作用。

请解释 C 中的析构函数&#xff0c;并说明它们的作用。 在C中&#xff0c;析构函数&#xff08;Destructor&#xff09;是一种特殊类型的成员函数&#xff0c;用于在对象被销毁时执行特定的清理工作。析构函数的名称与类名相同&#xff0c;前面加上一个波浪号&#xff08;~&am…

【C++开篇 -- 入门语法篇】

C学习笔记---001 C知识开篇1、介绍C的背景以及与C语言的区别1.1、什么是C?1.2、C的背景 2、C与C语言的区别3、C优化命名空间3.1、C中的问题3.2、命名空间的应用 4、总结 C知识开篇 前言&#xff1a; 首先&#xff0c;C兼容C&#xff0c;C在C语言范畴上增添了一些优化&#xf…

WPF中样式

WPF中样式:类似于winform中控件的属性 <Grid><!-- Button属性 字体大小 字体颜色 内容 控件宽 高 --><Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/></Grid&g…

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

UE5 动态加载资源和类

// Called when the game starts or when spawned void AMyActor::BeginPlay() {Super::BeginPlay();if (MyActor){UE_LOG(LogTemp,Warning,TEXT("MyActor is %s"),*MyActor->GetName());}//动态加载资源UStaticMesh* MyTmpStaticMesh LoadObject<UStaticMesh…

什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?

什么时候会触发 FullGC&#xff1f; 除直接调用 System.gc 外&#xff0c;触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象&#xff0c;当执行 Full GC 后空间仍然不 足&#xff0c;则…