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

时间:2017-04-20 11:52:07

标签: docker dockerfile

我正在尝试从Dockerfile创建一个Image。

# 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

构建Image时,目录不会更改为/ root / 。我认为问题可能是缺少tar文件,以便在将其更改为/ root目录后确认打印当前工作目录。但是我已经在容器中验证了包已成功复制到/ root目录。我甚至通过试验其他目录来验证,即使对于那些目录没有改变。 由于此问题,后续步骤失败:

# 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

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

3 个答案:

答案 0 :(得分:5)

使用WORKDIR

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

或在一次RUN中完成所有操作

你的cd已被遗忘"当你在另一次跑步时

顺便说一句,将您的RUN分组,如Dockerfile最佳实践中所示

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

答案 1 :(得分:3)

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

  

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

     

它可以在一个Dockerfile中多次使用。如果是亲戚   提供路径,它将相对于前一个路径   WORKDIR指令。例如:

     

WORKDIR / WORKDIR b WORKDIR c RUN pwd最终密码的输出   这个Dockerfile中的命令是/ a / b / c。

     

WORKDIR指令可以先解析环境变量   使用ENV设置。您只能使用显式设置的环境变量   在Dockerfile中。例如:

     

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

答案 2 :(得分:0)

var arrayCollections = ${jsonArray}; $('#jstreesD').jstree({ 'core' : { ], 'data' :[ arrayCollections,'<button>Press</button> Ok'], }, }) <div id="jstreesD"></div> 替换为RUN cd /root,将WORKDIR /root替换为RUN cd virtualgatewayconsole_package

或使用

WORKDIR virtualgatewayconsole_package

阅读this