WORKDIR

一、WORKDIR指令说明


用来指定当前工作目录(或者称为当前目录)

当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准

相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行

 

二、案例


1.dockerfile内部使用WORKDIR指令 

首先,先创建一个dockerfile:

复制代码

#base image
FROM centos

#MAINTAINER,this dockerfile creater
MAINTAINER loose@docker.com

#安装wget命令,这里有需要让我们输入y/n选项,所以添加-y
RUN yum install wget -y

#创建/usr/local/tomcat目录
RUN mkdir /usr/local/tomcat

#定位到tomcat下载目录
WORKDIR /usr/local/tomcat

#wget tomcat.tar.gz到/usr/local/tomcat目录
RUN wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.86/bin/apache-tomcat-7.0.86.tar.gz

复制代码

该dockerfile主要是创建一个目录,然后定位到创建的目录中,最后wget tomcat.tar.gz

其次,构建镜像并查看镜像:

最后,进入伪交互模式,查看dockerfile文件中WORKDIR定位的目录中是否存在tomcat.tar.gz包:

 

2.在外部指定WORKDIR

可以在 docker run命令中用 -w参数覆盖掉WORKDIR指令的设置,这时我们进入伪交互的时候顺便解压tomcat.tar.gz:

这时候是有解压操作执行的,我们用-w覆盖WORKDIR指令参数,再次解压:

最后,我们再根据-w执行具体的路径地址,再次解压:

 

 

 

WORKDIR 指定工作目录

格式为 WORKDIR <工作目录路径>

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。

之前提到一些初学者常犯的错误是把 Dockerfile 等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:

RUN cd /app
RUN echo "hello" > world.txt

如果将这个 Dockerfile 进行构建镜像运行后,会发现找不到 /app/world.txt 文件,或者其内容不是 hello。原因其实很简单,在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令;而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。这就是对 Dockerfile 构建分层存储的概念不了解所导致的错误。

之前说过每一个 RUN 都是启动一个容器、执行命令、然后提交存储层文件变更。第一层 RUN cd /app 的执行仅仅是当前进程的工作目录变更,一个内存上的变化而已,其结果不会造成任何文件变更。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。

因此如果需要改变以后各层的工作目录的位置,那么应该使用 WORKDIR 指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值