首页 > docker > 通过Dockerfile制作docker镜像

通过Dockerfile制作docker镜像

docker 2024-01-08

    以python为例,介绍如何制作镜像和使用镜像。
1、创建镜像
    为了在docker容器中运行python程序,首先要编写Dockerfile.txt文件,并以此来制作镜像。一般的我们将Dockerfile文件放置在python项目根目录下,如下图所示:

    一个简单的Dockerfile文件内容是这样的:

 
FROM python:3.7-slim
 
WORKDIR /work
 
COPY . /work
 
RUN pip install --no-cache-dir -r requirements.txt
 
# 如果不能自动运行请尝试加上:RUN chmod +x main.py
 
CMD ["python", "main.py"]
第一行表示使用python:3.7-slim为基础镜像(可以在dockerhub中找到,dockerhub是一个存放镜像的云仓库,类似于github)。

第二行表示在docker容器根目录下创建一个名为work的工作目录。

第三行表示将本机当前目录下的内容复制到容器工作目录。

第四行使得创建容器时自动安装项目依赖,本例中我们安装numpy。

第五行使得容器启动后自动运行main.py。另外如果加了这句指令仍不能自动运行,请尝试加上我注释的代码RUN chmod +x main.py授予权限。

编写好Dockerfile后开始制作镜像。首先运行DockerDesktop程序(请事先安装),之后在终端打开项目文件。


可以看到python项目内容以及我们编写的Dockerfile正在此目录内。使用如下指令构建镜像:

docker build -t <镜像名称> . -f Dockerfile.txt

可以使用docker images指令查看存在镜像的信息,可以看到我们新创建的镜像

2、使用镜像创建容器

        如果需要进行数据卷挂载,需在这里进行。通俗的讲,数据卷挂载就是将容器中的一个文件(夹)和本机中的一个文件(夹)关联起来。例如容器中有一个文件夹A,本机中有一个文件夹B。那么B中内容同步在A中,容器内可见;容器中对A文件夹的内容进行修改也会同步在B文件夹,在本机可见。我们以挂载两个文件夹(input,output)分别用作程序输入输出为例。

使用如下指令构建容器(方括号指令可选)

docker run [--rm] [--name <容器名称>] [-v <本机文件夹路径>:<容器文件夹路径>] <镜像名称>

--rm 使得容器为一次性容器,程序运行结束后容器退出并销毁。如果需要容器后仍存在,请删除。

--name <容器名称> 是给容器命名,不添加系统会自动生成名称。

-v 进行数据卷挂载

当然还有很多其他的参数可选,如有需要请查阅官方文档。

容器启动后自动运行main.py,相应的本机挂载的文件夹中出现输出结果。

#main.py内容
import os
import numpy as np
print('hello docker')
print(np.zeros((3,3)))
files=os.listdir('/input')
with open('/output/temp.txt','w',encoding='utf-8') as f:
    for i in files:
        f.writelines([i+'\n'])

       可以看到容器启动后确实自动运行了main.py脚本。由于使用了--rm,所以程序运行结束后容器退出并销毁!

3,交互式运行容器/镜像修改

       如果需要修改一个已有镜像,需要用该镜像创建一个容器并在该容器中进行修改,最后将该容器保存为一个新镜像。

3.1 编辑

用如下指令交互式启动容器(启动容器运行bash终端):

docker run -it <镜像名称> /bin/bash

注意,这里一定不能使用--rm,因为我们需要使用该容器创建新镜像。

3.2保存

在容器中修改好镜像后使用exit退出容器,使用如下指令将该容器保存为一个新镜像:

docker commit <容器名> <新镜像名>

 使用新镜像启动容器发现程序不能自动运行了!这是因为前面交互式启动容器时设置成了容器启动后运行bash终端。我是这样解决的:以该镜像为基础镜像创建新镜像(编写新dockerfile并创建镜像)。

docker build -t <新镜像名> . -f <Dockerfile.txt本机地址>