由于docker-compose.yml中command命令的参数过长,需要对其进行转义并换行处理

Docker友好的命令可以在没有配置文件的情况下通过参数来指定各种行为,非常方便,但是命令参数往往会变得很长。

例如,oauth2_proxy是一个单一可执行文件,虽然有配置文件,但所有配置都可以通过参数来指定。

如果毫无考虑地简单排列,启动命令会变得极长。

version: '2'
services:
  oauth2_proxy:
    image: oauth2_proxy
    command: /bin/oauth2_proxy -provider="github" -github-org="${OAUTH2_PROXY_GITHUB_ORG}" -github-team="${OAUTH2_PROXY_GITHUB_TEAM}" -http-address="0.0.0.0:4180" -redirect-url="https://upstream/oauth2/callback" -upstream="http://upstream:4440/" -email-domain="*" -cookie-refresh="1h"

无法阅读。

在 yml 文件中,如何转义换行字符?
在 yml 文件中,我们可以使用 > 符号来代替在 Shell 中常见的 \ 符号。

version: '2'
services:
  oauth2_proxy:
    image: oauth2_proxy
    command: >
      /bin/oauth2_proxy
      -provider="github"
      -github-org="${OAUTH2_PROXY_GITHUB_ORG}"
      -github-team="${OAUTH2_PROXY_GITHUB_TEAM}"
      -http-address="0.0.0.0:4180"
      -redirect-url="https://upstream/oauth2/callback"
      -upstream="http://upstream:4440/"
      -email-domain="*"
      -cookie-refresh="1h"

非常容易閱讀。

顺便提一下,YML文件中有两种换行符号,> 符号表示多行通过空格连接在一起进行评估,而 | 符号表示多行通过换行连接在一起进行评估。

顺便一提,当使用便捷的 envsubst 在 Docker 中将环境变量嵌入到配置文件中时,如果要将环境变量嵌入到nginx配置中,双引号中的内容必然会变得较长。

如果想在双引号中换行的话,可以用 “>” 将其分为多行,并用空格连接起来,这样在双引号中的部分就可以用 “\” 实现换行。很复杂。(2017/02/05修正:换行符号不是因为双引号而是缩进导致的。很复杂)

在双引号中,如果不需要缩进,可以直接简单地排列。

version: '2'
services:
  nginx:
    image: nginx:alpine
    command: >
      /bin/sh -c
      "envsubst '
      $$NGINX_SERVER_NAME
      $$NGINX_UPSTREAM_HOST
      $$NGINX_UPSTREAM_PORT
      '< /etc/nginx/nginx.conf.template
      > /etc/nginx/nginx.conf
      && nginx -g 'daemon off;'"
    volumes:
      - ./nginx.conf.template:/etc/nginx/nginx.conf.template
    ports:
      - 8080:80
    environment:
      NGINX_SERVER_NAME: "test.example.com"
      NGINX_UPSTREAM_HOST: "hoge"
      NGINX_UPSTREAM_PORT: "80"

如果要在之间进行缩进,换行符就会被插入进去。如果想要进行缩进,只需在每一行前面加上”>”符号并用空格连接,如果缩进的文本中有换行符号,则需要在换行符前面加上反斜杠”\”,这样就可以实现换行。很复杂。

version: '2'
services:
  nginx:
    image: nginx:alpine
    command: >
      /bin/sh -c
        "envsubst ' \
        $$NGINX_SERVER_NAME \
        $$NGINX_UPSTREAM_HOST \
        $$NGINX_UPSTREAM_PORT \
        '< /etc/nginx/nginx.conf.template \
        > /etc/nginx/nginx.conf \
        && nginx -g 'daemon off;'"
    volumes:
      - ./nginx.conf.template:/etc/nginx/nginx.conf.template
    ports:
      - 8080:80
    environment:
      NGINX_SERVER_NAME: "test.example.com"
      NGINX_UPSTREAM_HOST: "hoge"
      NGINX_UPSTREAM_PORT: "80"

我在调试这个时,意识到有一个命令可以解析名为docker-compose config的配置文件,该命令只需进行解析。当出现转义有问题或语法错误时,可以使用该命令。以下是带缩进的示例的解析结果,供参考。

$ docker-compose config
networks: {}
services:
  nginx:
    command: "/bin/sh -c\n  \"envsubst ' \\\n  $NGINX_SERVER_NAME \\\n  $NGINX_UPSTREAM_HOST\
      \ \\\n  $NGINX_UPSTREAM_PORT \\\n  '< /etc/nginx/nginx.conf.template \\\n  >\
      \ /etc/nginx/nginx.conf \\\n  && nginx -g 'daemon off;'\"\n"
    environment:
      NGINX_SERVER_NAME: test.example.com
      NGINX_UPSTREAM_HOST: hoge
      NGINX_UPSTREAM_PORT: '80'
    image: nginx:alpine
    ports:
    - 8080:80
    volumes:
    - /Users/m-morita/work/tmp/20170204/nginx.conf.template:/etc/nginx/nginx.conf.template:rw
version: '2.0'
volumes: {}

因此,让我们适当地换行并使docker-compose.yml更易读。

广告
将在 10 秒后关闭
bannerAds