2017-04-20 76 views
0

我想從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 

在構建圖像的目錄不獲取改爲/根/。我認爲問題可能是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 
[email protected]:/# pwd 
/
[email protected]:/# cd /root/ 
[email protected]:~# pwd 
/root 

請幫助找出是什麼原因造成的問題。

回答

2

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

WORKDIR /path/to/workdir工作目錄的指令設置工作 目錄任何運行,CMD,入口點,COPY並添加 遵循它在Dockerfile說明。如果WORKDIR不存在,即使未在任何後續的Dockerfile 指令中使用,也會創建 。

它可以在一個Dockerfile中多次使用。如果提供了相對的路徑,它將相對於以前的 WORKDIR指令的路徑。例如:

WORKDIR/a WORKDIR b WORKDIR c RUN pwd此Dockerfile中最終pwd 命令的輸出爲/ a/b/c。

WORKDIR指令可以解析先前使用ENV設置的環境變量 。您只能在Dockerfile中使用明確設置爲 的環境變量。例如:

ENV DIRPATH /路徑WORKDIR $ DIRPATH/$ DIRNAME RUN命令pwd的 最終pwd命令的輸出在此Dockerfile將是/路徑/ $ 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 
0

WORKDIR /rootRUN cd virtualgatewayconsole_package替換RUN cd /rootWORKDIR 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