前沿
最近项目都使用容器部署,今天我们来讲讲如何使用Dockerfile
来部署项目
介绍
什么是Dockerfile
? Dockerfile
是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明
常用指令
- FROM (基于什么的镜像)
- WORKDIR (指定shell语句运行在那个路径下)
- COPY (将宿主机的文件拷贝到某个路径下)
- RUN (运行shell语句,只要构建就会运行,如echo 123 >> 1.txt)
- CMD (指定镜像启动运行的脚本,只有容器真正运行的时候才会运行的脚本,执行后容器的生命周期即结束,且一般为阻塞式语句,如tail)
- ENTRYPOINT (和CMD类似,区别在于:ENTRYPOINT非json数组形式 则以ENTRYPOINT为准(CMD无效),如果ENTRYPOINT和CMD都是json数组 则ENTRYPOINT+CMD拼接成shell)
- EXPOSE (暴露镜像指定的端口号)
- VOLUME (指定映射文件)
- ENV (指定docker 的环境变量,运行时一直无效)
- ARG (构建参数,运行时无效,可以构建时临时修改变量)
- LABEL (指定元数据,便于找到docker)
- ONBUILD (当前镜像构建的时候不会执行,基于当前镜像去构建的时候才会执行)
- STOPSIGNAL (指定容器用什么信号,一般指定信号名)
- HEALTHCHECK (检查容器的健康状态)
- SHELL (指定linux 为 /bin/sh , windows为cmd)
实战
举个例子,我们有一个golang的项目,每个环境需要读取不同的配置文件。那我们应该如何构建这个镜像呢?
我们可以采用分阶段的构建方法,这样可以把一些编译之类的工作放在第一个from的镜像里,直接把编译结果copy到第二个from的镜像中,从而减少最终的镜像大小。
查看我们的目录结构
etc
目录下我们放的是配置文件。可以根据环境来选择
我们来编写Dockerfile
文件
FROM golang:1.15-alpine as builder
ARG app_env
COPY . /app
WORKDIR /app
RUN go build && \
cp etc/test.yaml.${app_env} etc/test.yaml
FROM alpine:3.12.4
RUN mkdir -p /app/etc
COPY --from=builder /app/go-demo /app/go-demo
COPY --from=builder /app/etc/ /app/etc/
WORKDIR /app
ENTRYPOINT /app/go-demo
然后我们运行
docker build -t go-demo --build-arg app_env=dev .
docker run -d go-demo
这样我们的容器就构建完成了
致谢
感谢你看完这篇文章,有什么不对的地方欢迎指出,谢谢🙏
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。