【问题标题】:Docker compose won't find $PWD environment variableDocker compose 找不到 $PWD 环境变量
【发布时间】:2017-06-16 08:06:31
【问题描述】:

这是我的 docker-compose:

version: '2'
services:
  couchpotato:
    build:
        context: ./couchpotato
        dockerfile: Dockerfile
    ports:
     - 5050:5050
    volumes:
     - "${PWD}/couchpotato/data:/home/CouchPotato/data/"
     - "${PWD}/couchpotato/config:/home/CouchPotato/config/"

当我在 shell 中运行它时,在 docker-compose.yml 的目录中,我得到:

WARNING: The PWD variable is not set. Defaulting to a blank string.

并且撰写以 PWD 为空开始。

我没有在文件中看到任何错误,如下所示:https://docs.docker.com/compose/environment-variables/

【问题讨论】:

  • 如果你从同一个 shell 运行 env | grep PWD 会发生什么?
  • @BMitch 我得到了我的正常密码:/home/user/... 和 OLDPWD=...
  • 这就是你用来运行 docker-compose 命令的完全相同的 shell?您没有通过某种执行程序,通过任何类型的调度程序等启动它吗?因为当我在本地运行类似的东西时,我无法在 bash 下重现此错误。
  • @BMitch 不,我刚刚运行了 docker-compose up。这就是我所做的:回显 $PWD 并输入,打印 PWD。然后 docker-compose up 在下一行,得到警告
  • 就我而言,我碰巧是running docker-compose using sudoUsing the -E flag sudo 保留现有的环境变量为我解决了这个问题。 sudo -E bash -c 'docker-compose up'

标签: shell docker environment-variables


【解决方案1】:

您不需要${PWD},您只需将路径设置为相对路径,compose 就会扩展它(compose 路径与docker run 处理的路径之间的一个主要区别)。

version: '2'
services:
  couchpotato:
    build:
        context: ./couchpotato
        dockerfile: Dockerfile
    ports:
     - 5050:5050
    volumes:
     - "./couchpotato/data:/home/CouchPotato/data/"
     - "./couchpotato/config:/home/CouchPotato/config/"

至于为什么compose看不到这个变量,那要看你的shell了。 Compose 查找导出的环境变量、.env 文件的内容以及 docker-compose 命令的命令行标志。如果变量中的每一个都为空,您将收到该警告。

【讨论】:

  • 无论出于何种原因,Docker for Windows 都会与相对目录混淆。 ${PWD} 方法效果更好。
  • 我正在使用 Docker compose 和 Windows Linux 子系统。我可以将相对路径(如./config/nginx)不起作用并给出错误not a directory的事实联系起来。至少对我来说。使用${PWD} 代替. 可以解决问题
  • 需要注意的是,如果您使用 -f /path/to/compose.yml,那么相对卷将相对于模板。有时将它相对于 PWD 可能很有用,因此您可能想要包含它。跟壳有关。如果您在没有 shell 的情况下运行自动化,可能必须手动设置 PWD。​​span>
  • @boyd 我目前正在使用 ubuntu wsl2,并在那里安装了 docker 和 docker-compose,而不是在 Windows 上。尝试使用 ${PWD} 时,我收到以下警告:未设置 PWD 变量。默认为空字符串。
  • 当 docker-compose.yml 不在当前目录中时,点 (.) 和 PWD 变量可以扩展为不同的值:“。”展开到 YAML 文件所在的目录,PWD 是您当前的目录。因此它们可以服务于不同的目的。
【解决方案2】:

我的建议:将所有$PWD 更改为.

【讨论】:

  • 这和BMitch的回答一模一样
  • 在 docker-compose.yml 中,$PWD 的含义与“.”不同
  • @MBorg 不,不是——这个答案要短得多。
  • . 是相对于 docker-compose 文件的路径,而 $PWD 是一个环境变量,通常包含运行 docker-compose 命令的当前工作目录。它们不一样,除非您从与 yml 相同的目录运行 dc。
【解决方案3】:

如果您使用sudo 运行,$PWD 将不起作用。尝试来自 Docker for Linux https://docs.docker.com/engine/install/linux-postinstall/ 的推荐设置。

Sudo 将以不同的用户身份运行,使用不同的env

$ sudo env | grep -i pwd
$ env | grep -i pwd
PWD=/home/user
OLDPWD=/

【讨论】:

  • 先生,我可以联系电子邮件吗
  • 在推特上关注我@milmeninos :)
【解决方案4】:

如果你是really need absolute paths,那么在调用docker-compose up之前调用这个:

set PWD=%CD%

【讨论】:

    【解决方案5】:

    我的一个环境变量也有同样的问题。仔细查看我的bashrc 文件后,我发现我没有导出该变量。
    之前:
    VAR=<value>
    之后:
    export VAR=<value>

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2015-06-17
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2022-01-01
      • 2018-02-03
      • 2019-02-25
      • 2022-06-11
      相关资源
      最近更新 更多