2021-03-07 15:29:05 +08:00
# WORKDIR 指 定 工 作 目 录
2016-11-26 02:02:43 +08:00
格 式 为 ` WORKDIR <工作目录路径> ` 。
2017-03-14 17:06:48 +08:00
使 用 ` WORKDIR ` 指 令 可 以 来 指 定 工 作 目 录 ( 或 者 称 为 当 前 目 录 ) , 以 后 各 层 的 当 前 目 录 就 被 改 为 指 定 的 目 录 , 如 该 目 录 不 存 在 , ` WORKDIR ` 会 帮 你 建 立 目 录 。
2016-11-26 02:02:43 +08:00
之 前 提 到 一 些 初 学 者 常 犯 的 错 误 是 把 ` Dockerfile ` 等 同 于 Shell 脚 本 来 书 写 , 这 种 错 误 的 理 解 还 可 能 会 导 致 出 现 下 面 这 样 的 错 误 :
2017-11-23 23:48:52 +08:00
` ` ` docker
2016-11-26 02:02:43 +08:00
RUN cd / app
RUN echo "hello" > world . txt
` ` `
2017-11-23 23:48:52 +08:00
如 果 将 这 个 ` Dockerfile ` 进 行 构 建 镜 像 运 行 后 , 会 发 现 找 不 到 ` /app/world.txt ` 文 件 , 或 者 其 内 容 不 是 ` hello ` 。 原 因 其 实 很 简 单 , 在 Shell 中 , 连 续 两 行 是 同 一 个 进 程 执 行 环 境 , 因 此 前 一 个 命 令 修 改 的 内 存 状 态 , 会 直 接 影 响 后 一 个 命 令 ; 而 在 ` Dockerfile ` 中 , 这 两 行 ` RUN ` 命 令 的 执 行 环 境 根 本 不 同 , 是 两 个 完 全 不 同 的 容 器 。 这 就 是 对 ` Dockerfile ` 构 建 分 层 存 储 的 概 念 不 了 解 所 导 致 的 错 误 。
2016-11-26 02:02:43 +08:00
之 前 说 过 每 一 个 ` RUN ` 都 是 启 动 一 个 容 器 、 执 行 命 令 、 然 后 提 交 存 储 层 文 件 变 更 。 第 一 层 ` RUN cd /app ` 的 执 行 仅 仅 是 当 前 进 程 的 工 作 目 录 变 更 , 一 个 内 存 上 的 变 化 而 已 , 其 结 果 不 会 造 成 任 何 文 件 变 更 。 而 到 第 二 层 的 时 候 , 启 动 的 是 一 个 全 新 的 容 器 , 跟 第 一 层 的 容 器 更 完 全 没 关 系 , 自 然 不 可 能 继 承 前 一 层 构 建 过 程 中 的 内 存 变 化 。
因 此 如 果 需 要 改 变 以 后 各 层 的 工 作 目 录 的 位 置 , 那 么 应 该 使 用 ` WORKDIR ` 指 令 。
2020-09-06 20:16:04 +08:00
` ` ` docker
WORKDIR / app
RUN echo "hello" > world . txt
` ` `
如 果 你 的 ` WORKDIR ` 指 令 使 用 的 相 对 路 径 , 那 么 所 切 换 的 路 径 与 之 前 的 ` WORKDIR ` 有 关 :
` ` ` docker
WORKDIR / a
WORKDIR b
WORKDIR c
RUN pwd
` ` `
2021-03-11 23:09:37 +08:00
` RUN pwd ` 的 工 作 目 录 为 ` /a/b/c ` 。