官方文档

语法

  • 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”]

  1. <a name="D7xQG"></a>
  2. ## COPY --from
  3. - COPY 原来的语法是:COPY 宿主机 镜像;
  4. - `--from` 这个参数的含义是把多阶段与宿主机区别开, `--from` 后面加的是某阶段的镜像
  5. <a name="0sr5V"></a>
  6. ### --from=0
  7. - `--from=0` , 0 指的是第 1 个 build 阶段。
  8. ```dockerfile
  9. FROM golang:1.7.3
  10. WORKDIR /go/src/github.com/alexellis/href-counter/
  11. RUN go get -d -v golang.org/x/net/html
  12. COPY app.go .
  13. RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
  14. FROM alpine:latest
  15. RUN apk --no-cache add ca-certificates
  16. WORKDIR /root/
  17. COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
  18. 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”]

  1. <a name="A1rqN"></a>
  2. ## 使用外部镜像
  3. --from 的来源还可以是外部镜像。
  4. ```dockerfile
  5. COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

build 镜像

在某个阶段时停止 build

  1. docker build --target builder -t alexellis2/href-counter:latest .

多阶段 build 时需指定镜像名

一个阶段时,直接使用 docker build . 就可以,打包出来的镜像名是当前根目录的名字。
但是多阶段时,使用上述命令,打包出来的镜像名和 tag 为 ,所以需要指定镜像名:

  1. docker build -t $Name:$Tag .