【问题标题】:How to escape backtick in docker-compose.yml file?如何在 docker-compose.yml 文件中转义反引号?
【发布时间】:2020-10-03 22:01:39
【问题描述】:

我正在尝试运行内置 Web 服务器的 PHP 作为容器的启动,但 docker-compose up 抱怨它无法解析我的 docker-compose.yml 中的 ` 符号(反引号?反引号?)

这是我的 docker-compose.yml

version: "3"
services:
  sf-api:
    image: reston/php:7.1
    ports: 
      - "8000:8000"
    volumes:
      - ".:/tmp/target"
    working_dir: "/tmp/target"
    command: ["php","-S","`hostname -i`:8000"]   

我要做的是让 Web 服务器绑定到容器外部 IP 而不是 127.0.0.1。

编辑: 这是运行 docker-compose up 的输出

$ docker-compose up
Recreating storefrontapi_sf-api_1 ...
Recreating storefrontapi_sf-api_1 ... done
Attaching to storefrontapi_sf-api_1
sf-api_1  | Invalid address: `hostname -i`
storefrontapi_sf-api_1 exited with code 1

【问题讨论】:

  • 能否提供准确的错误信息
  • Docker compose 没有解析反引号,日志和错误来自您的应用程序。您希望命令在哪里运行,在您的主机上还是在您的容器内?
  • @BMitch 我打算在容器内运行命令。如果 compose 按原样提供整个命令,则反引号会被 shell 解析为子命令。

标签: docker docker-compose


【解决方案1】:

您明确告诉 docker-compose 不要在 shell 中使用您的命令的 json exec 语法运行您的命令。如果您希望 shell 解析容器内的反引号,则需要使用 shell 运行命令。请注意,这会破坏信号处理之类的事情,因为 pid 1 中的 shell 将拦截并忽略 SIGTERM(它假定它处于不希望 shell 退出的单用户模式)。命令的字符串语法为您运行 shell,或者您可以更改命令以显式启动 shell。这些中的任何一个都应该工作:

command: ["/bin/sh", "-c", "php -S `hostname -i`:8000"]   
command: "php -S `hostname -i`:8000"

【讨论】:

  • 在第一行解决了我的具体问题的基础上对此表示赞同。容器内的(默认)shell 可能不是 bash,因此它无法正确解析反引号。我使用的图像基于 alpine。
  • @bluearth docker 的默认 shell 始终是 /bin/sh,除非图像明确覆盖它,这对于 Alpine 图像来说是一个错误。 docs.docker.com/engine/reference/builder/#shell
【解决方案2】:

我确实第一次使用了以下 docker-compose.yml:

version: "3"
services:
  sf-api:
    image: reston/php:7.1
    ports: 
      - "8000:8000"
    volumes:
      - ".:/tmp/target"
    working_dir: "/tmp/target"
    command: ["php","-S","0.0.0.0:8000"]  

我绑定到任何可用的接口。它适用于我的情况,因为只有两个接口:环回和 eth0。可能不是每个人都这样。

是的,它让我再次遇到同样的问题并最终来到这里。再次。在这里为未来的我和其他人留下答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多