使用Dockerfile构建Docker镜像时无法更改目录

9
我正在尝试从Dockerfile创建一个镜像。
# 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

构建镜像时,目录没有更改为 /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个回答

16

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

WORKDIR /path/to/workdir 指令设置了Dockerfile中任何后续的RUN、CMD、ENTRYPOINT、COPY和ADD指令的工作目录。如果该目录不存在,即使它在任何后续的Dockerfile指令中都没有被使用,它也会被创建。

可以在同一个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。

# 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命令: 您希望将命令逻辑地分组成一层,可以作为其他镜像的模板。如果您认为这是单一的一层,则只需使用&&连接所有运行命令即可。此外,最终的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

0

WORKDIR /root替换RUN cd /root,用WORKDIR virtualgatewayconsole_package替换RUN cd 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

阅读 this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接