作者:云淡风轻轻00 | 来源:互联网 | 2023-01-30 12:23
Dockerfile是用来自定义构建镜像的文件。Dockerfile:FROMnginxRUNecho'这是一个本地构建的nginx镜像'usrshareng
Dockerfile是用来自定义构建镜像的文件。
Dockerfile:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FEOM : 指定基于哪个镜像进行自定义
RUN : 运行指令, 两种形式
RUN 命令
RUN ["test.php", "dev", "offline"]
等价于 test.php dev offline
docker 在每一行上新建一层,为了避免过多的层,用 &&
把一些命令缩成一行
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
[[email protected] dockerdir]# docker build -t imagetest:test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 8cf1bfb43ff5
Step 2/2 : RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
---> Using cache
---> 2611d7938c46
Successfully built 2611d7938c46
Successfully tagged imagetest:test
[[email protected] dockerdir]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imagetest test 2611d7938c46 2 hours ago 132MB
twilight/nginx ali 378d7ca4a813 3 hours ago 229MB
mysystem tags 1c174e9fbdee 3 hours ago 64.2MB
ubuntu 18.04 2eb2d388e1a2 6 days ago 64.2MB
nginx latest 8cf1bfb43ff5 9 days ago 132MB
training/webapp latest 6fae60ef3446 5 years ago 349MB
[[email protected] dockerdir]#
docker build
会将上下文路径中的所有文件打包发送给引擎,所以上下文路径不能放无用的文件,会造成执行过程的缓慢。
指令
COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
: 目的路径不存在会自动创建。路径支持通配符。
ADD
用法与 COPY
一致,不同之处在于源文件为 gzip, bzip2, xz
格式,会自动解压并复制到目标路径下。
如果目标路径指定的是一个文件,则会覆盖这个文件(即使这个文件已经有内容),不存在就创建新文件
如果目标路径是一个目录,但是这个目录不存在,docker会自动创建目录
CMD ["<可执行文件或命令>","","
",...]
或 CMD
,用于在容器构建完成后执行的指令
可以写多条CMD,但是只有最后一条会生效
Dockerfile中的CMD命令可以被 docker run -it ubuntu 命令
中的命令覆盖。
RUN是运行在build的时期,而CMD运行在 docker run的时期
ENTRYPOINT ["","","
",...]
或者 ENTRYPOINT 命令
跟CMD的效果差不多,但是它始终会执行,或者被替换
如果有多条 ENTRYPOINT命令,那么只有最后一条会生效
如果定义了 ENTRYPOINT ["nginx", "-c"]
那么在 docker run
后面的参数会被追加到 nginx -c
的后面
如果 ENTRYPOINT ["nginx", "-c"]
和 CMD [""]
同时使用, CMD中的内容也会被追加到 ENTRYPOINT的后面
通过指定 --entrypoint 命令 参数
来覆盖ENTRYPOINT的内容
ENV
或者 ENV = =
: 定义的环境变量可以在build和run的时候以 $var
的形式引用
ARG
和 ENV作用一样,但是仅限于在Dockerfile内生效,可以在 docker build --build-arg key=value
来覆盖
VOLUME ["<路径1>", "<路径2>"...]
自动挂载数据卷
EXPOSE <端口1> [<端口2>...]
声明端口,方便配置
WORKDIR <工作目录路径>
目录必须已经存在,在构建镜像的每一层中,该目录都会存在。
USER <用户名>[:<用户组>]
切换用户
ONBUILD
本次不会执行,但是如果有新的Dockerfile引用了这个镜像,就会执行ONBUILD指定的命令
参考资料
https://www.runoob.com/docker/docker-dockerfile.html
https://blog.csdn.net/shunfa888/article/details/79373840
关于Dockerfile的写法的相关教程结束。