官方文档
https://docs.docker.com/develop/develop-images/multistage-build/
实战
布尔数据风险评估报告
- hodor
相关指令
FROM as/把之前的阶段当做新的阶段
英文:Use a previous stage as a new stage
语法
from ... as...
给当前 build 阶段起别名;from ...
, 可以把上一个阶段作为基础镜像。场景
使用多阶段镜像打包,能够避免每次重复编译base
镜像,加快编译镜像的速度。 ```dockerfile FROM python:3.7.2-slim-stretch as base
RUN mkdir -p /root/.pip RUN echo “[global]” > /root/.pip/pip.conf && \ echo “index-url = http://mirrors.aliyun.com/pypi/simple/“ >> /root/.pip/pip.conf && \ echo “[install]” >> /root/.pip/pip.conf && \ echo “trusted-host=mirrors.aliyun.com” >> /root/.pip/pip.conf COPY requirement.txt . RUN pip install -r requirement.txt -i http://mirrors.aliyun.com/pypi/simple/ —extra-index-url https://pypi.python.org/simple —trusted-host mirrors.aliyun.com FROM base RUN mkdir batch_test VOLUME /var/batch_test COPY . /batch_test RUN rm -rf /batch_test/venv ENTRYPOINT [“python”, “/batch_test/run.py”]
<a name="D7xQG"></a>
## COPY --from
- COPY 原来的语法是:COPY 宿主机 镜像;
- `--from` 这个参数的含义是把多阶段与宿主机区别开, `--from` 后面加的是某阶段的镜像
<a name="0sr5V"></a>
### --from=0
- `--from=0` , 0 指的是第 1 个 build 阶段。
```dockerfile
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]
—from=xxx
COPY --from=builder
,builder
是指上一个阶段的名字。上一个是数组,这个是 k v对。即便顺序打算,--from
时也不会出错。 ```dockerfile FROM golang:1.7.3 AS builder WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html
COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk —no-cache add ca-certificates
WORKDIR /root/
COPY —from=builder /go/src/github.com/alexellis/href-counter/app .
CMD [“./app”]
<a name="A1rqN"></a>
## 使用外部镜像
--from 的来源还可以是外部镜像。
```dockerfile
COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
build 镜像
在某个阶段时停止 build
docker build --target builder -t alexellis2/href-counter:latest .
多阶段 build 时需指定镜像名
一个阶段时,直接使用 docker build .
就可以,打包出来的镜像名是当前根目录的名字。
但是多阶段时,使用上述命令,打包出来的镜像名和 tag 为
docker build -t $Name:$Tag .