COPY、ADD主体功能类似:从指定位置src拷贝文件到Docker镜像dest。
COPY <src>... <dest>
ADD <src>... <dest>
COPY只允许从Docker Engine主机上拷贝文件到Docker镜像文件; ADD也能完成以上工作,但是ADD支持另外两种src:
ADD http://foo.com/bar.go /tmp/main.go
# 从指定地址下载文件,添加到镜像文件系统的/tmp/main.go位置
ADD http://foo.com/bar.go /tmp/
# 因为以/结尾,将会引用url中的文件名添加到指定的目录下
ADD /foo.tar.gz /tmp/
# 自动解压主机文件到指定目录
“有趣的是,URL下载和自动解压功能不能同时生效:任何通过URL下载的压缩包文件不会自动解压。
ARG、ENV也让人很疑惑的,都是Dockerfile中定义变量的指令。
ARG用于镜像构建阶段,ENV用于将来运行的容器。
ARG VAR_NAME 5
# 构建镜像时,可提供--build-arg VAR_NAME=6 修改ARG值。
ENV VAR_NAME_2 6
# 启动容器时,可通过docker run -e "VAR_NAME_2=7"或docker-compose.yml提供新的环境变量值来覆盖Dockerfile中设置的ENV值。
一个小技巧:构建镜像时不能使用命令行参数重写ENV,但是你可以使用ARG动态为ENV设置默认值:
# You can set VAR_A while building the image or leave it at the default
ARG VAR_A 5
# VAR_B gets the (overridden) value of VAR_A
ENV VAR_B $VAR_A
CMD ["executable","param1","param2"]
(可执行形式,最常见)CMD command param1 param2
(脚本形式)CMD echo "Hello world"
# run -it <image> 输出 Hello world
“但是当容器以命令启动,docker run -it <image> /bin/bash, CMD会被忽略,bash解析器将会运行:
root@98e4bed87725:/#
CMD ["param1","param2"]
(作为ENTRYPOINT指令默认值,此时必须提供ENTRYPOINT指令,且ENTRYPOINT也必须以Json Array形式)ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
# run -it <image> 将会输出 Hello world
# run -it <image> earth 将会输出 Hello earth
打算构建一个可执行的且常驻的镜像,最好选用ENTRYPOINT; 如果需要提供默认命令参数(可在容器运行时从命令行覆盖),请选择CMD。
阅读更多