1. docker build
1.1 build 命令
使用当前目录的 Dockerfile
打包 docker 镜像
docker build -t iamgename:1.0 .
1.2 Dockerfile 中使 root 权限
参考:https://stackoverflow.com/questions/38133849/cant-use-yum-inside-docker-container-running-on-centos
在执行 docker build
的时候,如果要使用 root
权限,需要在 Dockerfile
中增加 USER root
指令:
Dockerfile
USER root
1.3 使用多层进行构建
来源:https://docs.docker.com/build/building/multi-stage/
COPY --from=0
可以减少构建后的体积
例子
# syntax=docker/dockerfile:1
FROM golang:1.21
WORKDIR /src
COPY <<EOF ./main.go
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
EOF
RUN go build -o /bin/hello ./main.go
FROM scratch
COPY --from=0 /bin/hello /bin/hello
CMD ["/bin/hello"]
2. Dockerfile 中的选项
来源:https://www.jianshu.com/p/4508784f6ddc
FROM
FROM <image>:<tag> [as other_name]
# tag可选;不写默认是latest版as other_name
是可选的,通常用于多阶段构建(有利于减少镜像大小)- 通过
--from other_name
使用, 例如COPY --from other_name
-
scratch
:特殊的字段,表示一个空镜像 -
LABEL
- 镜像描述信息 LABEL author="zp wang <test@qq.com>"
LABEL describe="test image"
-
LABEL author="zp wang <test@qq.com>" describe="test image"
-
MAINTAINER
- 添加作者信息 -
MAINTAINER zp wang <test@163.com>
-
COPY
- 从构建主机复制文件到镜像中 COPY <src> <dest>
-
COPY ["<src>", "<src>", ... "<dest>"]
-
ADD
- 从构建宿主机复制文件到镜像中 ADD <src> <dest>
-
ADD ["<src>","<src>"... "<dest>"]
-
WORKDIR
- 设置工作目录 -
WORKDIR /opt
-
ENV
- 设置镜像中的环境变量 ENV <key> <value>
-
ENV <key>=<value> <key1>=<value1> <key2>=<value2> .....
-
USER
- 设置启动容器的用户 USER testuser
-
USER UID
-
RUN
- 镜像构建时执行的命令 RUN command1 && command2
- 语法1,shell 形式RUN ["executable","param1","[aram2]"]
- 语法2,exec 形式- RUN 在下一次建构期间,会优先查找本地缓存,若不想使用缓存可以通过
--no-cache
解除:docker build --no-cache
-
exec 形式不会调用shell解析。但exec形式可以运行在不包含shell命令的基础镜像中
-
EXPOSE
- 为容器打开指定的监听端口以实现与外部通信 EXPOSE <port>/<protocol>
EXPOSE 80
EXPOSE 80/http
-
EXPOSE 2379/tcp
-
VOLUME
- 实现挂载功能,将宿主机目录挂载到容器中 VOLUME ["/data"]
- #[“/data”]
可以是一个JsonArray ,也可以是多个值VOLUME /var/log
-
VOLUME /var/log /opt
-
CMD
- 为容器设置默认启动命令或参数 CMD command param1 param2 ...
# 语法1,shell形式CMD ["executable","param1","param2"]
# 语法2,exec形式-
CMD ["param1","param2"]
# 语法3,还是exec形式,不过仅设置参数 -
ENTRYPOINT
- 用于为容器指定默认运行程序或命令 - 与CMD类似,但存在区别,主要用于指定启动的父进程,
PID=1
ENTRYPOINT command
# 语法1,shell形式ENTRYPOINT ["/bin/bash","param1","param2"]
# 语法2,exec形式-
docker run
命令的--entrypoint
选项可以覆盖ENTRYPOINT
指令指定的程序 -
ARG
- 指定环境变量用于构建过程 ARG name[=default value]
ARG test_name
ARG nother_name=wzp
- ARG指令定义的参数,在构建过程以docker build --build-arg test_name=test 形式赋值
- 若ARG中没有设置默认值,构建时将抛出警告:[Warning] One or more build-args..were not consumed
- Docker默认存在的ARG 参数,可以在--build-arg时直接使用
-
HTTP_PROXY/http_proxy/HTTPS_PROXY/https_proxy/FTP_PROXY/ftp_proxy/NO_PROXY/no_proxy
-
ONBUILD
- 为镜像添加触发器 - ONBUILD可以为镜像添加一个触发器,其参数可以是任意一个Dockerfile指令
ONBUILD <dockerfile_exec> <param1> <param2>
ONBUILD RUN mkdir mydir
-
该指令,对于使用该Dockerfile构建的镜像并不会生效,只有当其他Dockerfile以当前镜像作为基础镜像时被触发。例如:Dockfile A 构建了镜像A,Dockfile B中设置FROM A,此时构建镜像B是会运行ONBUILD设置的指令
-
STOPSINGAL
- 设置停止时要发送给PID=1进程的信号 -
STOPSIGNAL signal
-
HEALTHCHECK
- 指定容器健康检查命令 HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ || exit 1
- 出现多次,只有最后一次生效
OPTIONS
选项--interval=30
:两次健康检查的间隔,默认为 30 秒--timeout=30
:健康检查命令运行的超时时间,超过视为失败,默认30秒--retries=3
:指定失败多少次视为unhealth,默认3次
-
返回值:
0
:成功;1
:失败;2
:保留 -
SHELL
- 指定shell形式的默认值 SHELL
指令可以指定RUN
、ENTRYPOINT
、CMD
指令的 shell,Linux 中默认为["/bin/sh", "-c"]
,Windows默认["CMD","/S","/C"]
SHELL ["/bin/bash","-c"]
SHELL ["powershell", "-command"]
RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""]