Docker(五):Dockerfile基础指令
参考地址:https://blog.csdn.net/weixin_43526371/article/details/126332507
构建三部曲
编写 Dockerfile
使用 docker build 命令从 Dockerfile 构建图像
docker run 镜像
指令
FROM LABEL RUN EXPOSE WORKDIR ENV
USER VOLUME ADD COPY CMD ENTRYPOINT
FROM
基础镜像,基于的镜像
# FROM 镜像:TAG
FROM centos:centos7
LABEL - (MAINTAINER <name> 维护者 已弃用)
标签
# LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
RUN
容器构建的时候执行的命令(分 shell 和 exec 形式)
RUN 指令在 docker build 时运行
# RUN 命令
# shell形式
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
# exec形式
RUN ["/bin/bash", "-c", "echo hello"]
EXPOSE
当前容器对外暴露的端口
# EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80/tcp
EXPOSE 80/udp
WORKDIR
指定创建容器后,终端默认登录进来的工作目录,相当于落脚点
# WORKDIR 路径
WORKDIR /path/to/workdir
ENV
定义环境变量
# ENV <key>=<value> ...
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
USER
指定该镜像以什么样的用户去执行,如果都不指定,默认为root
# USER <user>[:<group>]
# USER <UID>[:<GID>]
FROM microsoft/windowsservercore
RUN net user /add patrick
USER patrick
VOLUME
容器卷,相当于 -v
# VOLUME ["/data"]
VOLUME /var/lib/mysql
ADD
将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包,相当于COPY+解压
# ADD [--chown=<user>:<group>] <src>... <dest>
# ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
COPY
类似ADD,拷贝文件和目录到镜像中
# COPY [--chown=<user>:<group>] <src>... <dest>
# COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
CMD - (分 shell 和 exec 形式)
指定容器运行后执行的命令
只能有一条CMD指令Dockerfile。如果列出多个,CMD 则只有最后一个CMD才会生效,其他不会生效
CMD 指令在 docker run 时运行
$ docker run -it image /bin/bash
相当于在dockerfile的最后一行追加了一行CMD指令(CMD ["/bin/bash", "run"]),那么原有的指令便不会执行
如:CMD ["catalina.sh", "run"] CMD ["/bin/bash","run"]
# CMD ["executable","param1","param2"]
# CMD ["param1","param2"]
# CMD command param1 param2
FROM ubuntu
CMD echo "This is a test." | wc -
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
ENTRYPOINT - (分 shell 和 exec 形式)
用来指定一个容器启动时要运行的命令
# ENTRYPOINT ["executable", "param1", "param2"]
# ENTRYPOINT command param1 param2
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
例如:(nginx:test)
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
docker命令 衍生出的实际命令
docker run nginx:test nginx -c /etc/nginx/nginx.conf
docker run nginx:test -c /etc/nginx/new.conf nginx -c /etc/nginx/new.conf