Docker 堆栈条件环境变量

时间:2021-04-20 15:51:17

标签: docker docker-compose docker-swarm

我有一个 docker 堆栈文件,它部署在我的 swarm 中,它有很多节点。

出于特定原因,其中一个节点(我们称之为节点 A)与外部(互联网)有连接,而其他节点则没有,因此在其他节点上部署容器时,我需要设置 {{ 1}} 环境变量。

问题是:如何仅在具有特定标签的节点上(而不是在 A 节点上)设置此项

HTTP_PROXY

docker-compose.yml

目前唯一的选择是使用不同的变量部署堆栈,并对部署设置约束。但我正在努力避免它。

1 个答案:

答案 0 :(得分:0)

如何在必要的主机中设置这些环境变量并将它们传递给您的容器,如下所示:

version: '3'
 
services:
  app:
    image: ubuntu
    environment:
      - HTTP_PROXY
      - HTTPS_PROXY

如果它们也在宿主环境中设置,它们只会在容器中设置。见documentation here

示例/更多信息:

# 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"]

docker-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