Dockerfile 的“/app”工作目录是什么?

Int*_*rer 20 docker dockerfile

docker docs 入门教程第 2 部分中,它有一个制作 Dockerfile。它指示添加以下行:

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app
Run Code Online (Sandbox Code Playgroud)

什么是/app,为什么这是一个必要的步骤?

Pau*_*son 32

构建docker镜像时有两个重要目录:

  • 构建上下文目录。
  • WORKDIR目录。

构建上下文目录

它是主机上的目录,docker 将在其中获取文件以构建映像。它docker build作为最后一个参数传递给命令。(它可以是 URL,而不是主机上的 PATH)。简单的例子:

docker build -t myimage .
Run Code Online (Sandbox Code Playgroud)

这里的当前目录 ( .) 是构建上下文目录。在这种情况下,docker build将使用 位于该目录中的Dockerfile。该目录中的所有文件对docker build.

构建上下文目录不一定是 Dockerfile 所在的位置。Dockerfile 位置默认为当前目录,否则由-fotpion指示。例子:

docker build -t myimage -f ./rest-adapter/docker/Dockerfile ./rest-adapter
Run Code Online (Sandbox Code Playgroud)

这里的 build context dir 是./rest-adapter你调用的子目录docker build;Dokerfile 位置由 表示-f

工作目录

它是容器映像中的一个目录,可以使用WORKDIRDockerfile 中的指令进行设置。它是可选的(默认为/,但基础图像可能已设置它),但被认为是一个很好的做法。Dockerfile 中的后续指令,例如RUN,CMDENTRYPOINT将在此目录中运行。至于COPYand ADD,他们同时使用......

COPY 和 ADD 使用两个目录

这两个命令有<src><dest>

  • <src>是相对于构建上下文目录的
  • <dest>相对于WORKDIR 目录

例如,如果您的 Dockerfile 包含...

WORKDIR /myapp
COPY . .
Run Code Online (Sandbox Code Playgroud)

然后你的构建上下文目录的内容将被复制到/myapp你的 docker 镜像中的目录。

  • 很棒的答案! (6认同)
  • 最后一个答案和例子真正解释了这个问题#!*。到目前为止,我所看到的只是“WORKDIR THIS”和“COPY THAT”,没有解释什么被复制到哪里以及每个人似乎都有的神奇应用程序文件夹是什么。谢谢。 (4认同)
  • 关于构建上下文和工作目录的内容应该是入门指南的一部分。 (4认同)
  • 欢呼!亲爱的@Paulo,您能否添加更多有关如何在容器映像中看到基本映像(假设是 alpine)文件系统以及相对于上面定义的 WORKDIR 的信息? (2认同)
  • 您关于基本映像设置 WORKDIR 的评论非常有帮助。我无法从一开始就弄清楚路径是 /app ,并且 docker 文档也没有说明这一点。 (2认同)

Hug*_*sta 20

WORKDIR 是一个很好的做法,因为您可以将一个目录设置为主目录,然后您可以使用 COPY、ENTRYPOINT、CMD 命令对其进行处理,因为它们将指向此 PATH 执行。

Docker 文档: https : //docs.docker.com/engine/reference/builder/

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

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

Dockerfile 示例:

FROM node:alpine
WORKDIR '/app'
COPY ./package.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "start"]
Run Code Online (Sandbox Code Playgroud)

创建了一个 alpine node.js 并且工作目录是 /app,然后将 al 文件复制到 /app

最后 npm run start 命令运行到容器内的 /app 文件夹中。

如果您有 sh 或 bash tty,您应该执行以下命令:

docker exec -it <container-id> sh

或者

docker exec -it <container-id> bash

之后,您可以执行ls命令,您将可以看到 WORKDIR 文件夹。

我希望它可以帮助你

  • 好的跟进问题@Hugo Lesta。WORKDIR 是否在该特定容器的上下文中创建?换句话说,那个目录是在哪里创建的? (2认同)

Gav*_*ler 9

您需要声明一个工作目录并将代码移入其中,因为您的代码必须驻留在某个地方。否则您的代码将不存在并且您的应用程序将无法运行。然后,当使用RUNCMDENTRYPOINTCOPY和 等命令时,它们会在 的上下文中执行ADDWORKDIR

/app是任意选择的工作目录。您可以使用您喜欢的任何内容(foobarbaz),但app这样很好,因为它具有自我描述性且常用。