dockerfile外部命令
运行dockerfile
-
docker build -t $1 $2
$1=创建的镜像名字 $2=docker的目录位置,如果是当前位置 直接写 .
运行dockerfile并给dockerfile创建的镜像建立名字
-
docker build -t mysql:3.6.34 $1
$1=docker的路径
mariadb容器启动前需要先设置密码方法
-
docker run -d -p -e MYSQL_PASSWORD=$1 $2
$1=设置mysql密码 $2=容器名字或容器id
dockerfile文件命令
FROM 指定哪种镜像作为新镜像的基础镜像
FROM Ubuntu:14.04
MAINTAINER 指明该镜像的作者和其电子邮件
MAINTAINER keylin "130808991@qq.com"
ENV 设置环境变量,有两种形式
-
ENV <key> <value>
-
ENV <key>=<value>
例如:ENV ITBILU_PATH /home/itbilu/
$ITBILU_PATH 获得
RUN 在新镜像内部执行的命令,比如安装一些软件,配置一些基础环境,可使用\来换行
-
RUN echo 'hello docker!' > /usr/local/file.txt
也可以用exec格式 RUN [“executable”,“param1”,“param2”]
RUN [“yum”,"-y",“install”,“nginx”]
注意:executable是命令,后面的param是参数
COPY 将主机的文件复制到镜像内,如果目的位置不存在,docker会自动创建所需要的目录结构,但是他只是单纯的复制,不会做文件的提取和解压工作,
-
COPY application.yml /etc/springboot/hello-service/src/resources
注意:需要复制的目录一定要和dockerfile文件在一个目录下
ADD 将主机的文件复制到镜像中,和copy一样,只是会对压缩文件[tar,gzip,bzip2,etc]做提取和解压操作
```ADD jdk8_104.tar /etc/springboot/jdk/ ```
注意:他不会对zip解压哈,支持的格式有限制
EXPOSE 暴露镜像的端口,供主机做映射,启动镜像时,使用-P参数来将镜像端口与宿主机的随机端口做映射,使用方式很多(可以指定多个)
-
EXPOSE 8080
-
EXPOSE 8081
WORKDIR 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如
-
WORKDIR /usr/local
-
WORKDIR webservice
-
RUN echo 'hello-docker' > text.txt
…
最终会在/usr/local/webservice/目录下生产text.txt文件
ONBUILD 当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时,(比如用户的 镜像需要从某位准备好的位置添加源码,或者用户需要执行特定于构建镜像的环境的构建脚本),改命令就会被执行,
例如:创建镜像image-A
-
FORM ubuntu
…
ONBUILD ADD . /var/www
然后创建镜像image-B
FORM image-A
…
然后构建image-b的时候,日志会显示如下:
Step 0: FORM image-A
# Exceing 1 build triggers
Step onbuild-0 :ADD ./var/www
…
USER 指定该镜像以什么样的用户去执行
USER root
VOLUME 用来想基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
-
VOLUME /data/db /data/configdb
VOLUME 主机目录 容器目录
CMD 容器启动时需要执行的命令
-
CMD /bin/bash
也可以用exec语法,
-
CMD ["/bin/bash"]
注意:多个CMD的时只有最后一个生效
-
ENTRYPOINT 作用和用法和CMD一模一样
注意:CMD和ENTRPOINT区别
CMD命令会被docker run 的命令覆盖 而ENTRYPOINT会追加到ENTRYPOINT 后面
例如:
如果使用CMD ["/bin/bash"]
或 ENTRYPOINT ["/bin/bash"]
后,再使用docker run -ti image
启动,会自动进入容器,相当于追加了这个命令
但是,如果启动镜像的命令为 docker run -ti image /bin/ps
,使用CMD后面的命令就会被覆盖转而执行bin/ps命令。但是ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数
例如:ENTRYPOINT ["/usr/sbin/nginx"]
然后通过启动build之后的容器
docker run -ti image -g "daemon off"
此时的-g “daemon off” 会被当成参数传递给ENTRYPOINT,最后命令变成
docker/user/sbin/nginx -g "daemon off'
CMD和ENTRYPOINT都存在时
CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被docker run 后面的命令覆盖