欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

程序员文章站 2024-01-26 15:30:34
...
  USER 指令

  USER 语法

USER <user>[:<group>]
USER <UID>[:<GID>]

  USER 语义

  · 运行镜像和dockerfile中使用RUNCMDENTRYPOINT指令指定时,USER指令用于设置用户名(或UID),可选的设置用户组(或GID)。

  · 当为用户指定组时,用户将只有指定的组成员资格。任何其他配置的组成员身份都将被忽略。

  · 当用户没有主用户组时,镜像会在root用户组下运行。

  ·Windows上,如果用户不是内置帐户,则必须首先创建该用户。这可以通过作为dockerfile的一部分调用的net user命令来完成。

  USER 示例

FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick
  WORKDIR 指令

  WORKDIR 语法

WORKDIR /path/to/workdir

  WORKDIR 语义

  · WORKDIR指令为dockerfile中任何RUNCMDENTRYPOINTCOPYADD指令设置工作目录。如果WORKDIR不存在,即使在随后的dockerfile指令中没有使用它,也会创建它。

  · WORKDIR指令可以在dockerfile中多次使用。如果提供了相对路径,则该路径将相对于上一个WORKDIR指令的路径。例如:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

  此dockerfile中最后一个pwd命令的输出将是/a/b/c

  · WORKDIR指令可以解析以前使用ENV设置的环境变量。只能使用dockerfile中显式设置的环境变量。例如:

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

  这个dockerfile中最后一个pwd命令的输出将是/path/$DIRNAME

  VOLUME 指令

  VOLUME 语法

VOLUME ["/data"]

  VOLUME 语义

  · VOLUME指令使用指定的名称创建一个装入点,并将其标记为包含来自宿主机或其他容器的外部装入卷。该值可以是JSON数组、VOLUME["/var/log/"],也可以是带有多个参数的纯字符串,例如VOLUME/var/logVOLUME/var/log/var/db

  · docker run命令使用存在于基础镜像中指定位置的任何数据初始化新创建的卷。例如,考虑以下dockerfile片段:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

  ·dockerfile会生成一个镜像,docker run/myvol处创建一个新的装载点,并将greeting文件复制到新创建的卷中。

  · VOLUME的使用说明

  1) 基于Windows的容器上的卷:使用基于Windows的容器时,容器内卷的目标必须是以下之一:

   ① 不存在或空的目录。

   ② C以外的磁盘驱动器。

  2)dockerfile中更改卷时,如果任何生成步骤在声明卷后更改了卷内的数据,则这些更改将被丢弃。

  3) JSON格式:列表被解析为JSON数组。单词必须用双引号(")括起来,而不是单引号(')。

  ​4) 主机目录在容器运行时声明:主机目录(装入点)本质上依赖于主机。这是为了保持镜像的可移植性,因为不能保证给定的注解目录在所有主机上都可用。因此,您不能从dockerfile中装载主机目录。VOLUME指令不支持指定host-dir参数。创建或运行容器时必须指定装入点。

USER、WORKDIR、VOLUME 示例

​   · 指定工作目录写入文件,并指定数据卷,以便在宿主机中更改。

​  1) 进入/securitit/dockerfile/目录(根据个人选择,这是本文使用的目录),创建dockerfile文件。

FROM nginx
MAINTAINER Securitit
WORKDIR /securitit/
RUN cd /securitit
RUN echo "This is Securitit's Hello World which come from dockerfile!!!" > hello.txt
VOLUME /securitit
CMD /bin/bash

​  2) 执行如下的构建命令,基于dockerfile构建镜像。

docker build -f /securitit/dockerfile/dockerfile -t securitit-nginx-user-work-volume:1.0.0.1 .

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

​  3) 查看镜像信息。

docker images

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

​  4) 指定通过dockerfile生成的镜像启动容器。

docker run --name securitit-nginx-user-work-volume -it -d -p 80:80 securitit-nginx-user-work-volume:1.0.0.1

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

​  5) 查看容器信息。

docker ps -a

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

  6) 进入容器,确认文件是否已添加到容器内/securitit/目录下。

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

  此时正是dockerfile中的WORKDIR起到了作用,是得生成的hello.txt在目录/securitit/下。

  7) 查看容器的数据卷信息。

docker inspect -f {{".Mounts"}} e479c505cc76

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

  通过查看镜像信息可以看到,目前的数据卷对应在主机的目录是:/var/lib/docker/volumes/bdc54b7ada63b78f84aff731a2abac53863cb9187a86a5d77e678eddcdf6c872/_data

  8) 进入7中的目录,查看文件并修改。

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

  可以看到有一个为hello.txt的文件,此文件即是容器中/securitit/hello.txt文件,其内容也与容器中/securitit/hello.txt相同。

​   对/var/lib/docker/volumes/bdc54b7ada63b78f84aff731a2abac53863cb9187a86a5d77e678eddcdf6c872/_data/hello.txt文件进行修改,加入This is Host's Hello World which come from Host change!!!

  9) 进入容器,确认文件已改变。

Dockerfile USER、WORKDIR、VOLUME指令 语法解析

  可以看到,/securitit/hello.txt已经过发生改变,与我们在宿主机上所做修改一直。

​  总结

​  USER用来处理用户和用户组,WORKDIR用来指定容器工作目录,VOLUME可以完成宿主机与容器、容器与容器之间的数据通信。

​  若文中存在错误和不足,欢迎指正!