Dockerfile07 -- Dockerfile构建python

一、Dockerfile搭建python

# 1、创建python目录
# 2、编写Dockerfile python文件
# 3、访问测试
1、创建python目录
[root@ccse ~]# mkdir  python
[root@ccse ~]# cd python/
2、编写dockerfile文件
 # 1、编写Dockerfile文件
[root@ccse ~/python]# vim Dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip3 install -i https://pypi.douban.com/simple flask
COPY app.py /opt
WORKDIR /opt
EXPOSE 8080
CMD ["python3","app.py"]

# 2、准备文件
[root@ccse ~/python]# vim app.py 
# coding:utf8
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return 'hello docker, i am mm'
if __name__=='__main__':
    app.run(host='0.0.0.0',port=8080)
    
# 3、查看
[root@ccse ~/python]# ll
total 8
-rw-r--r-- 1 root root 344 Dec  3 14:57 Dockerfile
-rw-r--r-- 1 root root 184 Dec  3 14:51 app.py
# 4、构建镜像
[root@ccse ~/python]# docker build -t mm_python .
Successfully built 04bb727cf38e
Successfully tagged mm_python:latest
# 5、启动容器
[root@ccse ~/python]# docker run -d --name my_python -p 8080:8080 mm_python
63353ec19497d524efe7f206ae306bdd94cdd39fbc9d75a69aa7dcdf0c414b3e
# 6、访问宿主机,查看容器内flask web网站
http://120.46.132.244:8080/
hello docker,i am mm

在这里插入图片描述

3、修改网站内容
# 1、修改宿主机的代码,以及dockerfile,重新构建
# 2、进入容器内修改代码,重新容器

[root@ccse ~/python]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                                       NAMES
154cde37e3cf   046b995dda29       "python3 app.py"         6 minutes ago   Up 6 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   xenodochial_proskuriakova
[root@ccse ~/python]# docker exec -it 154cde37e3cf bash
[root@154cde37e3cf opt]#  vi app.py 
 return 'hello mm'
[root@ccse ~/python]# docker restart 154cde37e3cf
# 3、访问宿主机,查看容器内flask web网站
http://120.46.132.244:8080/
hello mm
<think> 我们正在讨论Dockerfile中的`--from=build`,这实际上是在多阶段构建(multi-stage build)中使用的语法。在多阶段构建中,我们可以从一个构建阶段复制文件到另一个构建阶段,而`--from=build`就是用来指定从哪个构建阶段复制文件。 ### 一、`--from=build`的含义 1. **多阶段构建背景**:为了解决镜像过大和包含不必要构建工具的问题,Docker 17.05引入了多阶段构建。它允许在单个Dockerfile中使用多个`FROM`指令,每个`FROM`开始一个新的构建阶段。 2. **`--from=build`的作用**:在`COPY`指令中,`--from=build`表示从名为`build`的构建阶段复制文件(而不是从构建上下文或远程URL)。这里`build`是某个构建阶段的别名(通过`AS build`指定)。 ### 二、用法示例 ```dockerfile # 第一阶段:构建阶段,命名为build FROM node:14 AS build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 生成dist目录 # 第二阶段:运行阶段 FROM nginx:alpine # 从build阶段复制/dist目录到当前阶段的/usr/share/nginx/html COPY --from=build /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` - **关键点**: 1. 第一阶段使用`AS build`命名阶段。 2. 第二阶段使用`COPY --from=build ...`从第一阶段复制构建产物(这里是/dist目录)。 ### 三、相关细节 1. **阶段命名规则**: ```dockerfile FROM golang:1.16 AS builder # 阶段别名builder ... COPY --from=builder /go/bin/app /usr/local/bin/app ``` 2. **匿名阶段引用**:若未命名,可通过序号引用(从0开始): ```dockerfile COPY --from=0 /path/in/stage0 /dest ``` 3. **跨镜像复制**:`--from`不仅限于同一Dockerfile中的阶段,还可从其他镜像复制: ```dockerfile COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf ``` ### 四、优势与应用场景 - **减小镜像体积**:构建阶段包含编译工具链(如GCC、Node.js),运行阶段只需运行时环境(如Nginx、JRE)[^1]。 - **安全性提升**:运行阶段不包含源代码和构建工具,减少攻击面。 - **典型用例**:编译型语言(Go、Rust)、前端框架(React/Vue的静态文件打包)、Java应用(Maven/Gradle构建)[^2]。 ### 五、注意事项 1. **阶段间文件路径**:务必确保`COPY --from`的源路径在对应阶段存在。 2. **构建顺序**:Docker按顺序执行各阶段,但仅最终阶段(或明确`--target`指定的阶段)会生成镜像。 3. **缓存机制**:每个阶段独立缓存;修改后续阶段不会重建前面阶段(除非依赖改变)。 ### 六、高级用法 - **`--target`指定构建阶段**:构建时指定停止在某个阶段: ```bash docker build --target build -t myapp:build . ``` - **构建参数传递**:使用`ARG`在阶段间传递变量(需在每个阶段重新声明): ```dockerfile ARG VERSION=latest FROM base AS build ARG VERSION # 继承上层ARG值 RUN make --version=$VERSION ``` §§相关问题§§ 1. 如何在多阶段构建中复用前阶段的环境变量? 2. 如何优化多阶段构建的缓存效率? 3. 如何在Kubernetes中实现多阶段构建? 4. `COPY --from`能否复制其他容器的文件? </think> ### Dockerfile 中 `--from=build` 的含义与用法详解 `--from=build` 是 Docker **多阶段构建(Multi-stage Builds)** 中的关键语法,用于在不同构建阶段之间复制文件。以下是核心知识点: --- #### 一、核心含义 1. **跨阶段文件复制** `COPY --from=build` 表示从名为 `build` 的构建阶段(由 `AS build` 定义)复制文件到当前阶段,而非从主机上下文复制。 2. **多阶段构建基础** 多阶段构建通过多个 `FROM` 指令划分独立构建阶段: ```dockerfile # 阶段1:命名为 "build" FROM node:14 AS build RUN npm install && npm run build # 阶段2:最终阶段 FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html # 从build阶段复制文件 ``` 3. **核心价值** - ✅ **减小镜像体积**:丢弃构建工具和中间文件(如编译环境) - ✅ **提升安全性**:最终镜像不包含源代码或敏感构建信息 - ✅ **优化构建速度**:复用已构建的中间产物 [^2] --- #### 二、具体用法 1. **基本语法** ```dockerfile COPY --from=<阶段名> <源路径> <目标路径> ``` 2. **命名阶段引用** ```dockerfile FROM golang:1.18 AS builder # 命名为builder COPY . . RUN go build -o /app FROM alpine COPY --from=builder /app /app # 从builder阶段复制 ``` 3. **匿名阶段引用**(通过索引) ```dockerfile FROM python:3.8 AS compile-stage # 阶段0 ... FROM python:3.8-slim COPY --from=0 /venv /venv # 通过索引0引用第一阶段的venv目录 ``` 4. **从外部镜像复制** ```dockerfile COPY --from=nginx:latest /etc/nginx/nginx.conf /config/ ``` --- #### 三、关键注意事项 1. **阶段命名规则** - 阶段名通过 `AS <name>` 定义(示例:`FROM node AS frontend-build`) - 名称需唯一且符合DNS命名规范(字母、数字、连字符) 2. **路径作用域** 路径始终相对于**源阶段的根目录**(非主机文件系统),例如: ```dockerfile COPY --from=build /output/app.jar /app.jar # 复制build阶段的/output/app.jar ``` 3. **缓存机制** - 修改 `--from` 的源路径会触发当前阶段缓存失效 - 修改源阶段的内容不会自动触发后续阶段重建(需手动清理缓存)[^3] --- #### 四、实用示例场景 **场景:构建Java应用(分离编译与运行环境)** ```dockerfile # 阶段1:编译(带JDK/Maven) FROM maven:3.8-jdk-11 AS build COPY src /src COPY pom.xml . RUN mvn package -DskipTests # 生成target/app.jar # 阶段2:运行(仅JRE) FROM openjdk:11-jre-slim COPY --from=build /target/app.jar /app.jar # 从build阶段复制JAR CMD ["java", "-jar", "/app.jar"] ``` **结果对比**: | 构建方式 | 镜像大小 | 包含源代码 | 包含构建工具 | |----------------|----------|------------|--------------| | 单阶段构建 | ~650MB | 是 | 是 | | 多阶段+`--from`| ~150MB | **否** | **否** | --- #### 五、常见错误解决 1. **错误:`--from=build: no such stage`** **原因**:未正确定义 `AS build` 阶段的名称 **修复**:检查阶段命名一致性(区分大小写) 2. **错误:源文件不存在** **原因**:路径未基于源阶段的根目录 **修复**:确认源阶段是否生成文件(如通过 `RUN ls` 调试) 3. **缓存未更新问题** **解决**:构建时添加 `--no-cache` 或修改目标路径触发重建: ```bash docker build --no-cache -t myapp . ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL919

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值