使用Dockerfile构builddocker Image时无法更改目录

我正在尝试从Dockerfile创build一个图像。

# cat Dockerfile FROM ubuntu:16.04 COPY $pwd/intel_virtual_gateway_console64_1_9_0.tar /root/ COPY $pwd/login.exp /root/ RUN cd /root RUN echo $PWD RUN tar -xvf intel_virtual_gateway_console64_1_9_0.tar RUN cd virtualgatewayconsole_package RUN apt-get update && apt-get install expect \ expect-dev 

在构build映像时,目录不会变为/ root / 。 我以为问题可能是tar文件丢失,以确认打印当前工作目录后,将其更改为/根目录。但我已经在容器中validation包已成功复制到/根目录。 我甚至通过尝试其他目录来validation,即使那些目录没有改变。 由于这个问题,后续步骤失败:

 # docker build -t release:1.0 . Sending build context to Docker daemon 633.2MB Step 1/8 : FROM ubuntu:16.04 ---> 6a2f32de169d Step 2/8 : COPY $pwd/intel_virtual_gateway_console64_1_9_0.tar /root/ ---> Using cache ---> 36e9ea407082 Step 3/8 : COPY $pwd/login.exp /root/ ---> Using cache ---> 578f9f9481d9 Step 4/8 : RUN cd /root ---> Running in 07ccfc507888 ---> ad60f9d31c7e Removing intermediate container 07ccfc507888 Step 5/8 : RUN echo $PWD ---> Running in e0ec2df6a0dc / ---> 979a42368814 Removing intermediate container e0ec2df6a0dc Step 6/8 : RUN tar -xvf intel_virtual_gateway_console64_1_9_0.tar ---> Running in 0701db595e27 tar: intel_virtual_gateway_console64_1_9_0.tar: Cannot open: No such file or directory tar: Error is not recoverable: exiting now The command '/bin/sh -c tar -xvf intel_virtual_gateway_console64_1_9_0.tar' returned a non-zero code: 2 

但是能够改变容器内的目录。

 # docker run -it 979a42368814 /bin/bash root@100b02ddc98a:/# pwd / root@100b02ddc98a:/# cd /root/ root@100b02ddc98a:~# pwd /root 

请帮助找出是什么原因造成的问题。

使用WORKDIR

https://docs.docker.com/engine/reference/builder/#workdir

或者在一个RUN中全部完成

当你在另外一个RUN时,你的cd被“忘记”了

顺便说一下,按照Dockerfile最佳实践中的说明对RUN进行分组

https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/

你需要使用WORKDIR而不是在一个RUN光盘。 https://docs.docker.com/engine/reference/builder/#workdir

WORKDIR /path/to/workdir WORKDIR指令为Dockerfile中的任何RUN,CMD,ENTRYPOINT,COPY和ADD指令设置工作目录。 如果WORKDIR不存在,即使它不在任何后续的Dockerfile指令中使用,它也将被创build。

它可以在一个Dockerfile中多次使用。 如果提供了相对path,则将相对于以前的WORKDIR指令的path。 例如:

WORKDIR / a WORKDIR b WORKDIR c RUN pwd此Dockerfile中最后一个pwd命令的输出是/ a / b / c。

WORKDIR指令可以parsing先前使用ENV设置的环境variables。 您只能使用在Dockerfile中显式设置的环境variables。 例如:

ENV DIRPATH / path WORKDIR $ DIRPATH / $ DIRNAME RUN pwd此Dockerfile中最终pwd命令的输出将是/ path / $ DIRNAME

 # cat Dockerfile FROM ubuntu:16.04 COPY $pwd/intel_virtual_gateway_console64_1_9_0.tar /root/ COPY $pwd/login.exp /root/ WORKDIR /root RUN echo $PWD RUN tar -xvf intel_virtual_gateway_console64_1_9_0.tar WORKDIR virtualgatewayconsole_package RUN apt-get update && apt-get install expect \ expect-dev 

关于对RUN命令进行分组:您希望将命令按照逻辑的方式分组到您认为是一个图层的任何地方。 一些可能是其他图像的模板。 如果你认为这是一个单一层,那么只需要把所有的运行命令与&& s连接起来。 另外,最后的WORKDIR将成为Docker镜像的当前工作目录,所以记住这一点。

 # cat Dockerfile FROM ubuntu:16.04 COPY $pwd/intel_virtual_gateway_console64_1_9_0.tar /root/ COPY $pwd/login.exp /root/ RUN cd /root && \ echo $PWD && \ tar -xvf intel_virtual_gateway_console64_1_9_0.tar && \ cd virtualgatewayconsole_package && \ apt-get update && apt-get install expect \ expect-dev WORKDIR /root/virtualgatewayconsole_package 

WORKDIR /rootreplaceRUN cd /root ,用WORKDIR virtualgatewayconsole_package

或使用

 RUN cd /root && echo $PWD && tar -xvf intel_virtual_gateway_console64_1_9_0.tar && cd virtualgatewayconsole_package && apt-get update && apt-get install expect \ expect-dev 

阅读这个