Dockerfile USER、WORKDIR、VOLUME指令 语法解析
USER 指令
USER 语法
USER <user>[:<group>]
USER <UID>[:<GID>]
USER 语义
· 运行镜像和dockerfile
中使用RUN
、CMD
和ENTRYPOINT
指令指定时,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
中任何RUN
、CMD
、ENTRYPOINT
、COPY
和ADD
指令设置工作目录。如果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/log
或VOLUME/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 .
3) 查看镜像信息。
docker images
4) 指定通过dockerfile
生成的镜像启动容器。
docker run --name securitit-nginx-user-work-volume -it -d -p 80:80 securitit-nginx-user-work-volume:1.0.0.1
5) 查看容器信息。
docker ps -a
6) 进入容器,确认文件是否已添加到容器内/securitit/
目录下。
此时正是dockerfile
中的WORKDIR
起到了作用,是得生成的hello.txt
在目录/securitit/
下。
7) 查看容器的数据卷信息。
docker inspect -f {{".Mounts"}} e479c505cc76
通过查看镜像信息可以看到,目前的数据卷对应在主机的目录是:/var/lib/docker/volumes/bdc54b7ada63b78f84aff731a2abac53863cb9187a86a5d77e678eddcdf6c872/_data
。
8) 进入7中的目录,查看文件并修改。
可以看到有一个为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) 进入容器,确认文件已改变。
可以看到,/securitit/hello.txt
已经过发生改变,与我们在宿主机上所做修改一直。
总结
USER
用来处理用户和用户组,WORKDIR
用来指定容器工作目录,VOLUME
可以完成宿主机与容器、容器与容器之间的数据通信。
若文中存在错误和不足,欢迎指正!
下一篇: SEO 两大搜索引擎网站近期算法分析