Dockerfile是一个包含用于组合映像的命令的文本文档。
可以使用在命令行中调用任何命令。
Docker通过读取Dockerfile中的指令自动生成映像。
在Linux
和 Centos
中运行代码是会print
到控制台的
一、Dockerfile文件说明
Dockerfile 一般分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
#
为 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用于在镜像容器中执行命令,其有以下两种命令执行方式:
- shell执行格式:
RUN <command>
示例
RUN apk update
- 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中具体进行了以下操作:
-
apt update
: 更新可用软件包列表。 -
apt install sudo
: 安装sudo命令行工具。 -
sudo apt update
: 使用sudo权限再次更新可用软件包列表。 -
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的命令执行以下操作:
-
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。 -
/bin/bash ~/miniconda.sh -b -p /miniconda
: 使用/bin/bash命令运行刚才下载的miniconda.sh脚本,以便进行安装。注意,这里的-b选项表示要生成一个基本的安装,-p选项指定了安装路径(这里是/miniconda)。 -
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
这条命令做了以下几件事:
-
RUN . /root/.bashrc
: 运行/root/.bashrc
文件。.bashrc
是一个bash shell的配置文件,通常用于设置环境变量或者定义别名等。这行命令可能是为了设置一些环境变量或者配置。 -
RUN /miniconda/bin/conda init bash
: 运行conda init bash
,这是初始化conda bash shell的命令。它将conda的命令添加到bash shell的初始化脚本中,这样每次开启新的bash shell时,都能自动运行conda的初始化命令。 -
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://www.toymoban.com/news/detail-830808.html
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模板网!