docker - Docker 堆栈条件环境变量
问题描述
我有一个 docker stack 文件,它部署在我的 swarm 中,它有很多节点。
由于特定原因,其中一个节点(我们称之为节点 A)与外部(互联网)有连接,而其他节点则没有,因此在其他节点上部署容器时,我需要设置HTTP_PROXY
环境变量。
问题是:我如何只在具有特定标签的节点上设置这个(而不是在 A 节点上)
docker-compose.yml
version: '3.6'
services:
app:
image: my_image
ports:
- "8033:8000"
environment:
- HTTP_PROXY=proxy.server.com:3128
- HTTPS_PROXY=proxy.server.com:3128
deploy:
replicas: 10
placement:
constraints: [node.labels.app_server == app_server]
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
到目前为止,唯一的选择是使用不同的变量部署堆栈,并对部署施加约束。但我试图避免它。
解决方案
如何在必要的主机中设置这些环境变量并将它们传递给您的容器,如下所示:
version: '3'
services:
app:
image: ubuntu
environment:
- HTTP_PROXY
- HTTPS_PROXY
如果它们也在宿主环境中设置,它们只会在容器中设置。请参阅此处的文档。
示例/更多信息:
# When HTTP_PROXY is set in the host environment, value is passed through to the container.
$ HTTP_PROXY=test docker-compose run app env | grep -i proxy
Creating some-nodes-only_app_run ... done
HTTP_PROXY=test
# When HTTP_PROXY is not set in the host environment, nothing is set in container.
$ docker-compose run app env | grep -i proxy
Creating some-nodes-only_app_run ... done
您还可以编写一个入口点脚本来在需要时设置代理。我建议检查容器的连接性,然后在必要时回退到代理,但如果您想根据主机名执行此操作,您可以使用以下内容:
入口点.sh
#!/bin/bash
PROXY_HOSTNAME=some-host
if [ -f /etc/host_hostname ]; then
HOST_HOSTNAME=$(cat /etc/host_hostname)
if [ "$HOST_HOSTNAME" = "$PROXY_HOSTNAME" ]; then
echo "Setting fallback http proxy"
export HTTP_PROXY=${FALLBACK_HTTP_PROXY}
fi
fi
exec $@
Dockerfile
# test:latest
FROM ubuntu
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
码头工人-compose.yml
version: '3'
services:
app:
image: test:latest
environment:
- FALLBACK_HTTP_PROXY=test
volumes:
- /etc/hostname:/etc/host_hostname:ro
示例运行:
$ docker-compose run app env | grep -i http_proxy
Creating some-nodes-only_app_run ... done
Setting fallback http proxy
FALLBACK_HTTP_PROXY=test
HTTP_PROXY=test
推荐阅读
- xml - 安装插件时出现 Odoo 错误:查看继承错误
- kubernetes - 当更改最大/最小副本限制时,水平 pod 自动缩放器如何处理未就绪的 pod
- html - CSS:没有“拉伸”左边框的填充顶部
- python - 使用 reportLab 将页眉和页脚添加到页面
- neo4j - 如何在 docker-compose 文件中的 neo4j 中启用“apoc.nlp.gcp.entities.stream”?
- javascript - ESP 32 AsyncWebServer 下载 .txt 文件?
- httpclient - 错误:调用使用属性错误声明的“HTTPClient::begin”:过时的 API,使用 ::begin(WiFiClient, url)
- reactjs - 从特定路径中的路径获取 id
- arrays - 内部 .map() 样式“this” Compenent (React.js)
- angular - 如何使用服务器端角度在所有页面的数据表中获取动态计数