"Dockerfile EXPOSE、WORKDIR、 ENV指令全面指南"

320 阅读6分钟

我正在参加「掘金·启航计划」

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:那些曾经把我击倒的人,谢谢你们,躺着真舒服。

3.3.5 WORKDIR

指令功能:

  • 该指令用于指定容器内部的工作目录。

指令语法:

  • 简单语法格式:

    
    WORKDIR <directory>
    

    其中, 是容器内部的工作目录。例如:

    
    WORKDIR /app
    

    这个命令将容器内部的工作目录设置为 /app。

  • 复杂语法格式:

    
    WORKDIR ["<directory>"]
    

    这种写法的 WORKDIR 指令也用于指定容器内部的工作目录,但是使用了 JSON 数组的形式指定目录名称。例如:

    
    WORKDIR ["/app"]
    

    这个命令与前面的例子相同,将容器内部的工作目录设置为 /app。

指令注意:

  • WORKDIR 指令可以出现多次,但每次只会影响后续指令的运行环境,不会影响之前的指令。例如:

    
    WORKDIR /app
    RUN apt-get update && apt-get install -y curl
    WORKDIR /data
    RUN curl -O http://example.com/data.txt
    

    这个命令先将容器内部的工作目录设置为 /app,然后运行 apt-get 命令安装 curl,接着将工作目录切换为 /data,并通过 curl 命令下载 example.com/data.txt 文件。

  • WORKDIR 指令并不会创建指定的目录,如果指定的目录不存在,则会出现错误。因此,在使用 WORKDIR 指令之前,最好先通过其他指令创建目录。

  • 使用简单语法格式,工作目录可加可不加双引号,但是使用复杂语法格式必须加双引号,否则会发生语法错误。

    
    WORKDIR "/my app"
    

    这个命令将容器内部的工作目录设置为 /my app 目录。如果不加双引号,会被解析为两个目录 /myapp,从而导致错误。使用高级指令可以有效的避免这种情况的产生。

3.3.6 ENV

指令功能:

  • 该指令用于设置环境变量。

指令语法:

  • 简单语法格式:

    
    ENV <key> <value>
    

    其中, 是环境变量的键, 是环境变量的值。例如:

    这个命令设置了一个名为 MY_NAME 的环境变量,其值为 John Smith。

    需要注意的是,环境变量是在容器运行时设置的,在 Dockerfile 中设置的环境变量将被包含在镜像中,并在容器启动时自动加载。此外,可以使用 ${key} 语法来引用环境变量,例如:

    
    ENV MY_NAME "John Smith"
    ENV GREETING "Hello, ${MY_NAME}!"
    

    这个命令设置了一个名为 GREETING 的环境变量,其值为 Hello, John Smith!,其中 ${MY_NAME} 引用了之前设置的 MY_NAME 环境变量。

    除了设置单个环境变量之外,还可以使用 ENV 指令一次设置多个环境变量,例如:

    
    ENV MY_NAME "John Smith" \
        MY_EMAIL "john.smith@example.com" \
        MY_ROLE "developer"
    

    这个命令设置了三个环境变量,分别是 MY_NAMEMY_EMAILMY_ROLE。需要注意的是,使用 `` 符号可以将多行代码合并为单行,以提高可读性。

  • 复杂语法格式:

    
    ENV <key1>=<value1> <key2>=<value2> ...
    

    这种格式的 ENV 指令可以一次设置多个环境变量,每个环境变量使用 = 的形式指定,用空格分隔。例如:

    
    ENV MY_NAME="John Smith" MY_EMAIL=john.smith@example.com MY_ROLE=developer
    

指令注意:

  • 如果环境变量的值中包含空格或其他特殊字符,则需要使用引号将其括起来。
  • 可以使用 `` 符号将多行代码合并为单行,以提高可读性。
  • 使用等号的形式更容易在脚本中进行自动化处理。因此,建议使用复杂格式的 ENV 指令来设置环境变量。

3.3.7 EXPOSE

指令功能:

  • 该指令用于告诉 Docker 容器运行时需要监听哪些端口。

指令语法:

  • 简单语法格式:

    
    EXPOSE <port> [<port>/<protocol>...]
    

    其中,<port> 是需要监听的端口号,<protocol> 是端口使用的协议,可以是 tcpudp,默认为 tcp。可以指定多个端口,用空格或逗号分隔。例如:

    
    EXPOSE 80/tcp 443/tcp
    

    这个命令告诉 Docker 容器需要监听 80 和 443 两个端口,使用的协议为 tcp。

  • 复杂语法格式:

    
    EXPOSE ["<port>", "<port>/<protocol>", ...]
    

    这种写法的 EXPOSE 指令也用于告诉 Docker 容器需要监听哪些端口,但是使用了 JSON 数组的形式指定端口和协议。例如:

    
    EXPOSE ["80", "443/tcp"]
    

    这个命令与前面的例子相同,告诉 Docker 容器需要监听 80 和 443 两个端口,使用的协议为 tcp。

指令注意:

  • EXPOSE 指令并不会实际打开容器的端口,它只是向外部提供了容器的端口信息,让其他容器或主机可以与之通信。要打开容器的端口,需要在运行容器时使用 -p 或 -P 参数进行端口映射。
  • JSON 数组形式的 EXPOSE 指令将整个端口和协议作为一个字符串传递给解释器执行,因此需要确保字符串中的引号和转义符正确。此外,JSON 数组形式的 EXPOSE 指令也可以避免在端口号和协议中使用空格等特殊字符时的问题。

3.3.8 MAINTAINER与LABEL

指令功能:

  • 该指令用于维护该镜像的作者和联系信息。

指令语法:

  • 简答语法格式:

    
    MAINTAINER <name>
    

    其中, 是维护该镜像的作者的名称和联系信息,例如:

    
    MAINTAINER John Smith <john.smith@example.com>
    

    这个命令指定了 John Smith 作为该镜像的作者,并提供了他的电子邮件地址。MAINTAINER 指令在 Docker 1.13 版本中已经被标记为废弃,建议使用 LABEL 指令来指定镜像的元数据信息。

  • 复杂语法格式:

    
    LABEL maintainer="<name>"
    

    这种写法的 LABEL 指令用于为镜像添加元数据标签,其中标签名(自定义)为 maintainer,标签值为维护该镜像的作者和联系信息。例如:

    
    LABEL maintainer="John Smith <john.smith@example.com>"
    

    这个命令与前面的例子相同,指定了 John Smith 作为该镜像的作者,并提供了他的电子邮件地址,但是使用了 LABEL 指令而不是 MAINTAINER 指令。

指令注意:

  • LABEL 指令可以用于指定镜像的各种元数据信息,包括作者、版本、描述、许可证等,因此建议使用 LABEL 指令来指定镜像的元数据信息。

以上项目的源代码,点击星球进行免费获取 星球 (Github地址)如果没有Github的小伙伴儿。可以关注本人微信公众号:Java学术趴,发送jQuery,免费给发给大家项目源码,代码是经过小编亲自测试的,绝对可靠。免费拿去使用

--------看完的大佬们可以关注一下小编,会一直更新小技巧,免费分享给大家呦!!!---------

点击星球可快速进入小编的Github星球呦!!里边还有更多好玩的技术,等待大家去探索呦!!