dockerfile基础

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





请使用浏览器的分享功能分享到微信等