在Docker中更改目录命令?

RPa*_*dox 186 cd docker

在码头工作者我想这样做:

git clone XYZ
cd XYZ
make XYZ
Run Code Online (Sandbox Code Playgroud)

但是因为没有cd命令,所以每次都必须传入完整路径(make XYZ/fullpath).对此有什么好的解决方案?

Jav*_*nos 463

要更改到另一个目录,请使用WORKDIR.WORKDIR之后的所有RUN,CMD和ENTRYPOINT命令都将从该目录执行.

RUN git clone XYZ 
WORKDIR "/XYZ"
RUN make
Run Code Online (Sandbox Code Playgroud)

  • 使用WORKDIR也被称为[dockerfile最佳实践](https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#workdir) (33认同)
  • 我相信这是对这个问题更合适的答案 (13认同)
  • 这应该是公认的答案。已测试并可以确认其有效 (3认同)
  • 请注意,这会创建多个层(我认为?) (2认同)

Ali*_*man 130

您可以在RUN上运行脚本或更复杂的参数.这是我之前下载的Dockerfile的示例:

RUN cd /opt && unzip treeio.zip && mv treeio-master treeio && \
    rm -f treeio.zip && cd treeio && pip install -r requirements.pip
Run Code Online (Sandbox Code Playgroud)

由于使用'&&',如果所有先前的命令都成功,它将只能进入最后的'pip install'命令.

实际上,由于每个RUN都会创建一个新的提交和(当前)AUFS层,如果你在Dockerfile中有太多的命令,你将用尽限制,所以合并RUN(当文件稳定时)可能是一个非常好的有用的事情要做.

  • 如果您想知道,`cd`的效果仅持续当前的'RUN`命令.下一个'RUN`将从当前的`WORKDIR`开始. (72认同)
  • 这不应该是解决方案。问题只是如何让 CD 发挥作用。 (2认同)

小智 35

RUN git clone http://username:password@url/example.git
WORKDIR /folder
RUN make
Run Code Online (Sandbox Code Playgroud)


Mia*_*mad 29

我想知道两次是否WORKDIR有效,但它有效:)

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y python3.6

WORKDIR /usr/src

COPY ./ ./

WORKDIR /usr/src/src

CMD ["python3", "app.py"]
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以对所有这些使用单个 RUN 命令

RUN git clone XYZ && \
    cd XYZ && \
    make XYZ
Run Code Online (Sandbox Code Playgroud)