dockerfile编写细节

编译 + 部署

通常我们需要在一个指定的目标环境进行代码的编译,比如nodejs12golang:1.15等环境

那么我们就可以编写 dockerfile 来实现

前提:一个 dockerfile 有且只有一个基础镜像,比如在生产环境运行时,其实不需要大而全的 nodejs 包,只需要一个小而美的即可

node:12.19.0,基础镜像300多M
node:12.19.0-alpine,基础镜像不到30M

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 使用node:12.19.0镜像编译源代码
FROM node:12.19.0 AS build
WORKDIR /code

COPY . .

# 安装依赖,将TS代码编译为ES5代码
# 导出到当前目录 dist
RUN yarn
RUN yarn build

# 只安装生产环境运行需要的依赖
# 比如类似TypeScript、webpack、babel等依赖就不必安装了,减少目标镜像的体积
RUN rm -rf node_modules
RUN yarn install --production

# 使用最小的node镜像运行node服务
FROM node:12.19.0-alpine

WORKDIR /code

# 拷贝编译后的资源到当前镜像内
COPY --from=build /code/dist /code/server
COPY --from=build /code/node_modules /code/node_modules

CMD ["node", "server"]

动态的dockerfile

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 声明获取docker build时的动态传参
ARG VERSION

# 可以同时引入多个镜像包
FROM source1:$VERSION AS source1-build
FROM source2:$VERSION AS source2-build
FROM source3:$VERSION AS source3-build

FROM final:alpine

WORKDIR /code

# 如果这里需要VERSION,还需要再通过声明获取
ARG VERSION
RUN echo $VERSION

COPY --from=source1-build /code/dist /code/source1-build
COPY --from=source2-build /code/dist /code/source2-build
COPY --from=source3-build /code/dist /code/source3-build

通过该dockerfile,制作最终的镜像命令

1
2
version=1.0.0
docker build --build-arg VERSION=${version} -f dockerfile -t source:$version .