Docker堆栈条件环境变量

Docker堆栈条件环境变量,docker,docker-compose,docker-swarm,Docker,Docker Compose,Docker Swarm,我有一个docker堆栈文件,部署在我的swarm中,它有许多节点 由于一个特定的原因,其中一个节点(我们称之为节点a)与外部(internet)有连接,而其他节点没有连接,因此在其他节点上部署容器时,我需要设置HTTP\u PROXY环境变量 问题是:如何仅在具有特定标签的节点上(而不是在节点上)设置此选项 docker compose.yml version: '3.6' services: app: image: my_image ports: - &q

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

由于一个特定的原因,其中一个节点(我们称之为节点a)与外部(internet)有连接,而其他节点没有连接,因此在其他节点上部署容器时,我需要设置
HTTP\u PROXY
环境变量

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

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
您还可以编写入口点脚本,以便在需要时设置代理。我建议检查容器的连接性,然后在必要时返回到代理,但如果您想基于主机名执行此操作,可以使用以下内容:

entrypoint.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

谢谢你的建议!现在我没有访问主机的权限Kay,在这种情况下,您可能应该向映像中添加一个入口点脚本,该脚本确定是否需要设置
HTTP\u代理,然后进行设置(可能基于另一个环境变量)。嗯,好的,在入口点上,我可以获取主机名或某个节点标签吗?当然,您可以将其作为环境变量传入,或者将
/etc/hostname
装入容器中的某个位置并从中读取。但我更倾向于测试容器的连接性,如果可用的话,可以使用代理。我将在本周晚些时候进行测试,并让您知道。谢谢