1) FROM
表示一个新的构建阶段,这个构建阶段依赖FROM后面的基础镜像
一个DockerFile可以有多个FROM,但是构建以最后的FROM为准,前FROM的构建的文件,可以被最后的FROM拷贝
# 编译阶段
FROM golang:1.10.3
COPY server.go /build/WORKDIR /build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o server
# 运行阶段
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=0 /build/server /
ENTRYPOINT ["/server"]
2) C O P Y
用于从本地、前置构建、镜像拷贝文件到现有构建中,与ADD的区别在于COPY不支持文件的解压,而ADD不支持多场景(前置构建以及镜像拷贝)
前置构建拷贝到当前构建
# 编译阶段 命名为 builder
FROM golang:1.10.3 as builder
# ... 省略
# 运行阶段
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=builder /build/server /
从镜像拷贝文件到现有构建
FROM ubuntu:16.04
COPY --from=quay.io/coreos/etcd:v3.3.9 /usr/local/bin/etcd /usr/local/bin/
3) RUN,CMD,ENTRYPOINT
RUN: 命令执行命令并创建新的镜像层,通常用于安装软件包
RUN apt-get update && apt-get install -y bzr subversion
CMD: 命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被dock er run命令后面的命令行参数替换,如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效
docker run -it [image] /bin/bash
这条命令回是CMD中的内容被忽略
ENTRYPOINT: ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行docker run时指定了其他命令) ,如果 Dockerfile 中如果存在多个ENTRYPOINT指令,仅最后一个生效,如果docker run 命令行待参数,则参数作为 ENTRYPOINT的参数
4) WORKDIR
设置容器中的当前工作目录,例如WORKDIR /usr/local/mysql
5) DockerFile制作镜像
docker build 通过dockerfile制作镜像,--rm :设置镜像成功后删除中间容器 --tag -t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签 --build-arg 将变量名传入到dockerfile中
docker tag 标记本地镜像,将其归入某一仓库
常见的golang makefile
SRV_NAME = xxxx
COMMAND_NAME = xxxx
VER = v1.2.3
CURRENT_VERSION = release-$(VER)
TEST_VERSION = test-$(VER)
NAMESPACE = sccmsp
DH_URL =mirrors.xxx.com
#GOOS = darwin
GOOS = linux
all: api
api:
CGO_ENABLED=0 GOOS=${GOOS} GOARCH=amd64 go build -gcflags='all=-N -l' -o $(COMMAND_NAME) -v .
test:api
docker build --build-arg SRV_NAME=$(COMMAND_NAME) --rm -t $(SRV_NAME):$(TEST_VERSION) .
docker tag $(SRV_NAME):$(TEST_VERSION) $(DH_URL)/${NAMESPACE}/$(SRV_NAME):$(TEST_VERSION)
docker push $(DH_URL)/${NAMESPACE}/$(SRV_NAME):$(TEST_VERSION)
publish:api
docker build --build-arg SRV_NAME=$(COMMAND_NAME) --rm -t $(SRV_NAME):$(CURRENT_VERSION) .
docker tag $(SRV_NAME):$(CURRENT_VERSION) $(DH_URL)/${NAMESPACE}/$(SRV_NAME):$(CURRENT_VERSION)
docker push $(DH_URL)/${NAMESPACE}/$(SRV_NAME):$(CURRENT_VERSION)
tools:
@-gofmt -w .
@-go tool vet . |& grep -v vendor;true
clean:
find . -name "[._]*.s[a-w][a-z]" | xargs -i rm -f {}
rm -f xxx
help:
@echo "make - compile go source"
@echo "make gotool - run gofmt & go too vet"
@echo "make clean - do some clean job"
.PHONY: all tools clean help api