当前位置:   article > 正文

【Docker】dockerfile学习_运行dockerfile

运行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>
  • 1
  • 2
  • 3
  • 4
  • 5

示例:

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

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

RUN

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

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

示例

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

示例:

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

注: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/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

示例

ADD ./* /scraper/
  • 1

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

COPY

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

ENV

ENV设置环境变量
格式:

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

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

示例:

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat=fluffy
  • 1
  • 2
  • 3
  • 4
  • 5

二、例子解析

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

这段命令 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
  • 1
  • 2

这段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
  • 1

在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

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

  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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(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"]   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(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 .
  • 1

.当运行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
  • 1

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

五、错误处理

重启docker是首选项

参考

service docker restart
  • 1

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

FileNotFoundError: [Errno 2] No such file or directory

参考
参考

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

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

COPY myfolder /app/
  • 1

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

-folder1
|   |-folder3
|   |-file.txt
|
-folder2
|
|
|-Dockerfile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

改为:

|-更上一级的folder
|   |-folder1
|       |-folder3
|       |-file.txt
|   |-folder2
|
|
|
|-Dockerfile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

请注意,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创建了项目容器,并运行成功,高兴

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/834650
推荐阅读
相关标签
  

闽ICP备14008679号