由于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更易读。