docker - Dockerfile常用指令

FROM

指定 base images

FROM centos:7.4.1708

MAINTAINER

设置镜像的作者

MAINTAINER [email protected]

我们设置了镜像的作者后,可以通过 docker inspect 命令查看镜像的信息,里面包含有作者信息。

[root@localhost dockerfile-instruction]# docker inspect c89334650819
[
    {
       
        "DockerVersion": "18.03.1-ce",
        "Author": "[email protected]",
        ...忽略其它信息
        "Metadata": {
            "LastTagTime": "2018-11-12T22:05:51.772312473+08:00"
        }
    }
]

COPY

复制本地主机的 src到容器中的 dest ,src必须在上下文中,一般情况下,将本地主机的一个包含Dockerfile的目录中的所有内容作为上下文,如docker/install。当使用本地目录为源目录时,推荐使用 COPY 。

下面的/root/dockerfile-instruction是build context

COPY /root/dockerfile-instruction/install /app/install

ADD

与 COPY 类似,不同的是,如果src的文件是identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压

 

EXPOSE

向外界暴露端口。这样就可以通过容器的ip地址+port访问到容器

在这里,我们不得不提docker run命令中的 -p 参数。docker run中的-p参数是对容器中的端口映射到host端口中,这样我们既可以通过容器的ip地址+port访问,也可以通过host的IP+端口访问到容器中的服务。

举个例子:

有一个helloworld的springboot服务,写了一个dockerfile文件,暴露了8080端口

FROM openjdk:8u181-jdk-alpine
VOLUME /app/springboot-docker
ADD springboot-docker-1.0.jar /app/springboot-docker/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/springboot-docker/app.jar"]

当我们通过dockerfile构建镜像并通过命令运行后

docker run -d --name springboot-docker springboot-docker

我们可以通过以下命令获取到容器的IP地址

docker inspect springboot-docker

这时,我们可以通过下面的命令访问到服务,172.17.0.2是该容器的IP

curl 172.17.0.2:8080/home

 

CMD

容器启动时运行指定的命令,CMD指令支持的格式

  • CMD ["executable","param1","param2"] 。推荐格式 
  • CMD ["param1","param2"] 。为ENTRYPOINT指令提供参数,此时的 ENTRYPOINT 指令需要使用 Exec 格式。其用途是为ENTRYPOINT 指令设置默认的参数
  • CMD command param1 param2 。执行shell内部命令

每个Dockerfile最多只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户通过dcoker run命令启动容器,将会覆盖掉 CMD 指定的参数代替。

下面以格式(1)距离说明,格式(2)将在 ENTRYPOINT 指令中举栗子。

Dockerfile如下,最后一行加入了CMD命令

FROM centos:7.4.1708
MAINTAINER [email protected]
CMD ["/bin/bash","-c","echo hello,docker"]

当我们运行该容器时,它会马上运行最后的命令。

[root@localhost dockerfile-instruction]# docker run -it dockerfile-instruction
hello,docker

如果通过下面的命令运行docker,则CMD参数会被替代

[root@localhost dockerfile-instruction]# docker run -it dockerfile-instruction echo bye
bye

 

ENV

设置环境变量,它可作用的其它指令:

  • ADD
  • COPY
  • ENV
  • EXPOSE
  • FROM
  • LABEL
  • STOPSIGNAL
  • USER
  • VOLUME
  • WORKDIR

也就是说,在这些指令中,可以通过 ${ENV_VALUE}替换

WORKDIR

设置工作目录,设置了工作目录,它将会作用于该指令后面的RUNCMDENTRYPOINTCOPY , ADD 指令。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章