使用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 /root
replaceRUN 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
阅读这个