這是(shi) 的(de)快速(su)參考備忘(wang)單。包含用(yong)戶可以在命令行上調用(yong)以組裝鏡像的(de)所有(you)命令。
默認 Dockerfile
位(wei)于上下文的根目錄中。
docker build -f /path/to/a/Dockerfile .
使用 -f
指向文件系統中任何位置的 Dockerfile
。
FROM [--platform=<platform>] <image> [AS <name>]
示例
FROM ruby:2.2.2
FROM golang:1.19-alpine3.16 AS build-env
ENV <key>=<value> ...
ENV APP_HOME /myapp
RUN mkdir $APP_HOME
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
RUN bundle install
WORKDIR
指令為任何 RUN
、CMD
、ENTRYPOINT
、COPY
和 ADD
指令設置工作目錄。
WORKDIR /myapp
VOLUME
指令(ling)創建一個具(ju)有指定名稱的掛載點,并將其標記為保存來自本機(ji)主機(ji)或其他容器的外部掛載卷。
VOLUME ["/data"]
# 安裝點規范
ADD file.xyz /file.xyz
# 復制
COPY host_file.xyz /path/container_file.xyz
ONBUILD RUN bundle install
# 與另(ling)一(yi)個文(wen)件一(yi)起使用(yong)時
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
指(zhi)令(ling)將(jiang)觸發(fa)指(zhi)令(ling)添加到(dao)鏡(jing)(jing)像中(zhong),以便稍后執行,此(ci)時鏡(jing)(jing)像用作另一個構建的基礎。
ENV my_var
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
# 使(shi)用嚴格模式:
RUN false # ails 像使用 && 一樣構建
RUN echo "$myvar" # 由于拼寫錯誤會拋出錯誤
RUN true | false # 將脫離管道
使用 shell
將為 shell 命令打(da)開(kai)嚴格(ge)模式。
:- | - |
---|---|
CMD ["executable","param1","param2"] | (exec 形式,這是首選形式) |
CMD ["param1","param2"] | (作為 ENTRYPOINT 的默認參數) |
CMD command param1 param2 | (shell形式) |
EXPOSE 5900
CMD ["bundle", "exec", "rails", "server"]
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
配(pei)置將作為可執行文件運行的容器。
ENTRYPOINT exec top -b
這將使用 shell 處理來替換 shell 變量,并將忽略任何 CMD
或 docker run
命令行參數。
LABEL version="1.0"
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="本文(wen)說明\
標簽值(zhi)可以跨越多行。"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
ARG <name>[=<default value>]
指令定義了一個變量,在構建時通過 docker build
命令使用 --build-arg <varname>=<value>
標志將其傳遞給構建器。
FROM busybox
# user1 默(mo)認(ren)值為 someuser
ARG user1=someuser
ARG buildno=1
# 注釋說明(ming)
*/temp*
*/*/temp*
temp?
:- | - |
---|---|
# comment | 忽略 |
*/temp* | 在根的任何直接子目錄中 排除名稱以 temp 開頭的文件和目錄 |
*/*/temp* | 從根以下兩級的任何子目錄中 排除以 temp 開頭的文件和目錄 |
temp? | 排除根目錄中名稱為temp 的單字符擴展名的文件和目錄 |
如果此文件存在,排除與其中的模式匹配的文件和目錄,有利于避免 ADD
或 COPY
將敏感文件添加到鏡像中(zhong)。匹配(pei)是使(shi)用 Go 的(de) 規則完成的(de)。
命令 | 說明 |
---|---|
FROM image | 構建的基礎鏡像 |
MAINTAINER email | (已棄用)維護者的名字 |
COPY [--chown=<user>:<group>] <src>... <dest> | 將上下文中的路徑復制到位置 dest 的容器中 |
ADD [--chown=<user>:<group>] <src>... <dest> | 與 COPY 相同,但解壓縮存檔并接受 http url。 |
RUN <command> | 在容器內運行任意命令。 |
USER <user>[:<group>] | 設置默認用戶名。 |
WORKDIR /path/to/workdir | 設置默認工作目錄。 |
CMD command param1 param2 | 設置默認命令 |
ENV <key>=<value> ... | 設置環境變量 |
EXPOSE <port> [<port>/<protocol>...] | 運行時偵聽指定的網絡端口 |
FROM lipanski/docker-static-website:latest
# 使用 .dockerignore 文件來(lai)控制鏡像中(zhong)的(de)內容(rong)!
# 復(fu)制當(dang)前目錄內容,到容器中
COPY ./ .
這會產生一個 154KB +
的單層鏡像。 如果您需要以不同的方式配置 httpd
,您可以覆(fu)蓋(gai) CMD 行(xing):
FROM lipanski/docker-static-website:latest
COPY . .
CMD ["/busybox","httpd","-f","-v","-p","3000","-c","httpd.conf"]
縮小鏡(jing)像過程,鏡(jing)像 。
FROM golang:alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest as prod
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY /go/src/github.com/go/helloworld/app .
CMD ["./app"]
使(shi)用多階段構建能將構建依賴留(liu)在 builder 鏡像中,只將編譯完成后的二進(jin)制(zhi)文件(jian)拷貝(bei)到運行(xing)環境(jing)中,大大減少(shao)鏡像體積。