(一)问题描述
我在一个python文件中写了若干计算方法,可以直接运行这个python文件,传入指定参数,得到计算结果。现在要将它和它的依赖包打包成一个docker镜像,方便在其他环境中使用。
(二)docker安装
这一步可以直接参考菜鸟教程啦,很详细了:Windows Docker 安装 | 菜鸟教程
(三)构建镜像
1. 创建Dockerfile
把python文件、依赖包清单(requirements.txt)、和Dockerfile放在一个文件夹里,例如你的文件结构可以是这样的:
my_project/
├── python文件.py
├── requirements.txt
└── Dockerfile
Dockerfile默认是没有文件后缀的,你可以用txt格式创建它,保存后再把文件后缀删掉。
WORKDIR
指令用于设置容器内的工作目录(working directory)。它是一个相对路径,用于指定后续指令(如 RUN
、CMD
、ENTRYPOINT
等)的执行路径。COPY
指令用于将文件或目录从宿主机复制到容器内的指定路径。这两个路径通常是一样的,但在某些情况下,WORKDIR
和 COPY
指定的目录也可以不同。这通常是为了满足特定的文件组织需求或优化镜像结构。
# 使用官方Python镜像作为基础镜像
FROM python:3.12# 设置工作目录
WORKDIR /app# 将当前目录下的文件复制到容器的工作目录中
COPY . /app# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 指定容器启动时运行的命令
CMD ["python", "XXX.py"]
2. 创建requirements.txt文件
这个文件记录的是依赖哪些包,可以通过这个命令生成这个文件:
pip freeze > requirements.txt
这样生成的是当前pip下安装的所有包。如果你用的包不多,只有一小部分,也可以手动输入,格式就是包名==版本号,换行符作为分隔符(就是输入完一个包换个行,中间不用加任何其他符号)。
(四)构建Docker镜像
在项目目录中打开终端,运行以下命令来构建Docker镜像(注意最后还有个点):
docker build -t 镜像名:标签 .
这里如果构建失败了可以看我总结的这篇:Docker构建镜像报错ERROR [internal] load metadata for docker.io/library/XXX-CSDN博客
参数说明:
-
-t
参数用于指定镜像的名称和标签(例如my_calculator:v1
)。 -
.
表示使用当前目录下的Dockerfile
。
(五)运行Docker容器
通过以下命令运行容器:
docker run --name 你的容器名 -d 镜像名:标签
运行以下命令看容器是否正常运行
docker ps
如果容器正常运行,你会看到类似以下的输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> gdelt_analysis:v1 "python gdelt_analysis…" 2 minutes ago Up 2 minutes gdelt_analysis_container
如果需要停止和删除容器,可以运行以下命令:
docker stop gdelt_analysis_container
docker rm gdelt_analysis_container
(六)推送镜像到Docker Hub
1. 注册docker hub账号
Docker Hub官网:Docker Hub Container Image Library | App Containerization,如果进不去的话科学上网一下。
注册账号这一步如果遇到问题可以看我总结的这篇:Docker Hub注册账号,多次更换邮箱仍显示Cannot use this email address, choose a different one.(邮箱不可用)问题解决-CSDN博客
2. 推送镜像
(1)方式一:Docker Desktop傻瓜操作(建议)
如果报错unauthorized: incorrect username or password就是没登录。如果登录了还报这个错,关了重启。如果重启了还是报这个错,退了用IE浏览器登录,等待登录之后页面自己跳转。
(2) 方式二:命令行操作
(a)登录Docker Hub:
docker login
回车之后会让你输入账号和密码,但是我在输入账号之后,发现密码输入不进去,不知道是因为网络卡顿还是怎样。如果输不进去,就打开docker hub登录一下,登录完了直接执行下一步就行,这里就可以跳过了。
(b)重新标记镜像
docker tag 镜像名:标签 用户名/镜像名:标签
(c)推送镜像
docker push 用户名/镜像名:标签