续接上回,今天我们继续学习docker,今天主要学习如何书写docker file

docker的安装信息等,参考上一篇:https://blog.csdn.net/weixin_55688516/article/details/153683191?spm=1001.2014.3001.5501

我学习的参考教程:

https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

https://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html

四、编写docker file与构建自定义镜像

1、选定一个GIthub仓库,获取。

这里我让GPT推荐,它推荐的自家的agent,是一个python项目。

git clone https://github.com/openai/openai-agents-python.git
cd openai-agents-python

2、创建 .dockerignore

作用:排除不需要打包进镜像的文件,避免冗余

在项目根目录新建 .dockerignore 文件,写入:

.git
__pycache__
*.log
.env

这里我介绍几种在Mac或者Linux中在命令行创建文件的办法:

1️⃣ 使用 echo + 重定向:

echo -e ".git\n__pycache__\n*.log\n.env\n" > .dockerignore

这里就是把需要的传入的指令连接起来,如果有要换行的地方,插入\即可。

cat .dockerignore 查看写入结果。

2️⃣ 交互式编辑

nano .dockerignore

之后输入内容,按 Ctrl + O → 回车 保存,按 Ctrl + X 退出。

3️⃣ touch+ GUI​​​​​​

touch .dockerignore 直接在当前目录创建文件,之后自行打开输入内容即可。

如果创建后没找到创建的文件,可能因为这个文件是隐藏文件,macos快捷键“shift+command+>” 查看隐藏文件

4️⃣ printf命令结束

printf ".git\nnode_modules\nnpm-debug.log\n" > .dockerignore

3、编写docker file

nano Dockerfile

写入以下内容(Python版本):

# 基础镜像
FROM python:3.11-slim

# 工作目录
WORKDIR /app

# 复制代码
COPY . .

# 安装依赖(优先 requirements*,否则安装当前包)
RUN python -m pip install --upgrade pip && \
    if [ -f requirements.txt ]; then \
        pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple; \
    elif [ -f requirements-dev.txt ]; then \
        pip install --no-cache-dir -r requirements-dev.txt -i https://pypi.tuna.tsinghua.edu.cn/simple; \
    else \
        pip install --no-cache-dir . -i https://pypi.tuna.tsinghua.edu.cn/simple; \
    fi

# 暴露端口(按需)
EXPOSE 8000

# 启动命令
CMD ["python",  "main.py"]

CMD开头的这个命令会被会被解析为 /bin/sh -c "python -m agents" -c的意思是告诉 shell 执行后面跟的那一整段字符串命令。

容器启动时自动寻找CMD指令进行执行,如果运行时的指令换为:docker run -it openai-agents-demo:0.1 /bin/bash 则会直接执行bin/bash,不再寻找CMD进行执行。

安装依赖这里,有的python项目用的requirements.txt来存储依赖,而有的是用的pyproject.toml。

pip install --no-cache-dir . -i https://pypi.tuna.tsinghua.edu.cn/simple ;

这条指令就是把当前目录当作一个 Python 项目(包含 setup.py 或 pyproject.toml),像安装普通包那样安装进去。

pip install /app

  • 扫描 setup.py 或 pyproject.toml;

  • 根据声明的依赖(如 install_requires)自动安装所有需要的包;

  • 并把整个项目自身也“打包安装”进容器。

--no-cache-dir

        告诉 pip 不要把下载的包缓存到容器里。因为 Docker 镜像的每一层都会被保存,缓存文件(几百 MB)会让镜像体积暴涨。加上这个参数后,下载完即安装,不留缓存文件,镜像会更小、更干净。

4、构建镜像

docker image build -t openai-agents-demo:0.1 .

-t → 为镜像命名并打标签;<镜像名称>:<标签>,不写标签时默认为latest

. → 当前路径(包含 Dockerfile)。

docker image ls

5、运行容器

docker container run -p 8000:8000 -it openai-agents-demo:0.1 /bin/bash

注意这里由于结尾有/bin/bash,他则会直接运行bin/bash,不会运行dockerfile里的CMD语句

但如果不加,就会直接运行完dockerfile之后结束

参数

含义

-p 8000:8000

将容器端口 8000 映射到主机 8000,

-p <主机端口>:<容器端口>

-it

进入交互模式(方便调试)

/bin/bash

进入容器内部的终端

6、容器管理操作

退出容器:exit / Ctrl+D;或者另一终端:docker stop <id>

查看容器:

docker container ls        # 查看正在运行的容器
docker container ls --all  # 查看所有容器(包括停止的)

停止容器:docker container kill [containerID]

删除容器文件:docker container rm [containerID]

这个指令是跑完自动删除:docker container run --rm -p 8000:8000 -it openai-agents-demo:0.1 /bin/bash

7、发布镜像到Docker Hub

docker login 登陆

docker image tag openai-agents-demo:0.1 yourname/openai-agents-demo:0.1 给镜像打标签

docker image push yourname/openai-agents-demo:0.1 推送镜像到Docker Hub

发布成功后可在

👉 https://hub.docker.com/repositories

查看你的镜像。

五、编写docker file与构建自定义镜像

1、挂载的意义

上文在dockerfile中写到这样一条代码:COPY . /app

这会在构建镜像时把当前目录复制进去。但之后改代码,镜像里不会自动更新,要重建镜像才行。

为了解决这个麻烦 ,Docker 提供了 挂载(mount / -v) 功能,允许你把宿主机(机器的目录)实时映射到容器里,容器就能看到最新的文件。

2、语法结构

docker run -v [宿主机目录]:[容器内目录] [镜像名]

举例:docker run -it -v "$(pwd)":/app -w /app openai-agents-demo:0.1 bash

参数

作用

-v "$(pwd)":/app

把你当前目录($(pwd))挂载到容器的 /app 目录

-w /app

设置容器工作目录为 /app

openai-agents-demo:0.1

选取的我上一篇文章创建的镜像

bash

进入交互式 shell

3、验证挂载是否成功

1️⃣ 启动容器:docker run -it -v "$(pwd)":/app -w /app openai-agents-demo:0.1 bash

2️⃣ 查看:ls          会发现和机项目目录一模一样。

3️⃣ 改动验证:在本机 touch test.txt;再回容器 ls —— 会看到 test.txt;反过来在容器里 rm test.txt,本机也会同步删除。说明挂载生效 ✅

4️⃣ 如果你想直接运行 Python 而不是交互 shell:

docker run --rm -v "$(pwd)":/app -w /app python:3.11-slim python main.py

这条命令的意思是:启动一个临时容器 → 把当前目录挂载进 /app →进入 /app → 执行 python main.py → 运行完自动删除容器。

4、挂载使用场景

一般在开发阶段,我们可能无法一次性确定好最终的dockerfile,以及最终的代码,所以我们有在原目录下更改代码的需求,所以需要挂载进dockerfile方便我们修改。

这个阶段,删除dockerfile中的COPY . /app的指令,然后运行上述内容即可。

更多推荐