Docker:RUN cd ...无法按预期工作

Max*_* L. 36 docker

以下Dockerfile:


FROM ubuntu:12.10
RUN mkdir tmp123
RUN cd tmp123
RUN pwd

有输出:


Uploading context 10240 bytes
Step 1 : FROM ubuntu:12.10
 ---> b750fe79269d
Step 2 : RUN mkdir tmp123
 ---> Running in d2afac8a11b0
 ---> 51e2bbbb5513
Step 3 : RUN cd tmp123
 ---> Running in 4762147b207c
 ---> 644801121b92
Step 4 : RUN pwd
 ---> Running in 3ed1c0f1049d
/
 ---> eee62a068585

构建时(docker build命令)

似乎RUN cd tmp123没有效果

为什么?

cre*_*ack 66

实际上是预期的.

dockerfile只不过是docker run + docker commit的包装器.

FROM ubuntu:12.10
RUN mkdir tmp123
RUN cd tmp123
RUN pwd
Run Code Online (Sandbox Code Playgroud)

与做同样的事情:

CID=$(docker run ubuntu:12.10 mkdir tmp123); ID=$(docker commit $CID)
CID=$(docker run $ID cd tmp123); ID=$(docker commit $CID)
CID=$(docker run $ID pwd); ID=$(docker commit $CID)
Run Code Online (Sandbox Code Playgroud)

每次运行时,都会生成一个新容器,因此pwd为'/'.

如果您愿意,可以在github上打开一个问题,以便向Dockerfile添加CHDIR指令.

  • WORKDIR命令用于此目的:http://docs.docker.com/reference/builder/#workdir (26认同)
  • 当人们犯这个错误时,如果`docker build`可能会发出某种警告,我也会很好,我只是浪费了很多时间来这个-_- (4认同)

Lid*_*Guo 13

也许你可以试试这个; 我不确定,我不能尝试.如果它不起作用,我希望你不要贬低.

只是:

RUN 'cd tmp123 ; pwd'
Run Code Online (Sandbox Code Playgroud)

代替

RUN cd tmp123
RUN pwd
Run Code Online (Sandbox Code Playgroud)

  • 我会做`RUN cd tmp123 && pwd` :) (29认同)