Dockerfile之COPY

本文将介绍Dockerfile中的COPY指令,该指令和ADD指令有一样的效果,只是该指令并不会附加其他操作,仅仅单纯的将文件从宿主机拷贝到镜像。

COPY 复制文件到镜像。格式:

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

 COPY package.json /usr/src/app/

<源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则,如:

COPY hom* /mydir/
 COPY hom?.txt /mydir/

<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。

此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。

在使用该指令的时候还可以加上 --chown=<user>:<group> 选项来改变文件的所属用户及所属组。

 COPY --chown=55:mygroup files* /mydir/
 COPY --chown=bin files* /mydir/
 COPY --chown=1 files* /mydir/
 COPY --chown=10:11 files* /mydir/

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

 COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下

因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。 ---《THE DOCKER BOOK》

实例:mysql的Dockerfile文件部分内容如下:

FROM debian:stretch-slim    

... 省略其他内容 ...

# 创建一个容器数据卷,将mysql的数据保存到宿主主机
VOLUME /var/lib/mysql

# 将sh文件拷贝到 /usr/local/bin/ 目录
COPY docker-entrypoint.sh /usr/local/bin/    

RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat    

ENTRYPOINT ["docker-entrypoint.sh"]    

# 暴露mysql接口
EXPOSE 3306 33060    

CMD ["mysqld"]
业精于勤,荒于嬉。——韩愈《进学解》
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号