【问题标题】:docker-compose : Scaling containers with distinct host volume mapdocker-compose : 使用不同的主机卷映射扩展容器
【发布时间】:2022-01-12 20:21:05
【问题描述】:
  1. 在这里,我部署了 2 个带有 --scale 标志的容器
docker-compose up -d --scale gitlab-runner=2

2. 正在部署两个容器,名称分别为 scalecontainer_gitlab-runner_1 和 scalecontainer_gitlab-runner_2。

  1. 我想为每个容器映射不同的卷。
/srv/gitlab-runner/config_${DOCKER_SCALE_NUM}:/etc/gitlab-runner
  1. 收到此错误:
WARNING: The DOCKER_SCALE_NUM variable is not set. Defaulting to a blank string.
  1. 有什么办法,我可以为单独的容器映射不同的卷。
services:
  gitlab-runner:
    image: "gitlab/gitlab-runner:latest"
    restart: unless-stopped
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - /srv/gitlab-runner/config_${DOCKER_SCALE_NUM}:/etc/gitlab-runner
version: "3.5"

【问题讨论】:

    标签: docker docker-compose gitlab docker-volume


    【解决方案1】:

    我认为您不能,对此here 有一个未决请求。在这里,我将尝试描述一种获得您想要的东西的替代方法。

    尝试从链接到所需目录的容器中创建符号链接。您可以通过从 docker API 读取容器名称并获取最终段来确定容器构建后的“编号”。为此,您必须将 docker 套接字安装到具有 big security implications 的容器中。

    设置

    这是一个获取容器编号的简单脚本(Credit Tony Guo)。

    get-name.sh

    DOCKERINFO=$(curl -s --unix-socket /run/docker.sock http://docker/containers/$HOSTNAME/json)
    ID=$(python3 -c "import sys, json; print(json.loads(sys.argv[1])[\"Name\"].split(\"_\")[-1])" "$DOCKERINFO")
    echo "$ID"
    

    然后我们有一个简单的入口点文件,它获取容器号,如果不存在则创建特定的配置目录,并将其特定的配置目录链接到已知位置(本例中为/etc/config)。

    entrypoint.sh

    #!/bin/sh
    
    # Get the number of this container
    NAME=$(get-name)
    CONFIG_DIR="/config/config_${NAME}"
    
    # Create a config dir for this container if none exists
    mkdir -p "$CONFIG_DIR"
    # Create a sym link from a well known location to our individual config dir
    ln -s "$CONFIG_DIR" /etc/config
    
    exec "$@"
    

    接下来我们有一个 Dockerfile 来构建我们的镜像,我们需要设置入口点并安装 curlpython 以使其工作。同时复制我们的get-name.sh 脚本。

    Dockerfile

    FROM alpine
    
    COPY entrypoint.sh entrypoint.sh
    COPY get-name.sh /usr/bin/get-name
    
    RUN apk update && \
        apk add \
            curl \
            python3 \
            && \
        chmod +x entrypoint.sh /usr/bin/get-name
    
    ENTRYPOINT ["/entrypoint.sh"]
    

    最后,一个简单的 compose 文件指定我们的服务。请注意,docker 套接字以及 ./config 已安装,这是我们不同的配置目录所在的位置。

    docker-compose.yml

    version: '3'
    
    services:
      app:
        build: .
        command: tail -f
        volumes:
          - /run/docker.sock:/run/docker.sock:ro
          - ./config:/config
    

    示例

    # Start the stack
    $ docker-compose up -d --scale app=3
    Starting volume-per-scaled-container_app_1 ... done
    Starting volume-per-scaled-container_app_2 ... done
    Creating volume-per-scaled-container_app_3 ... done
    
    # Check config directory on our host, 3 new directories were created.
    $ ls config/
    config_1  config_2  config_3
    
    # Check the /etc/config directory in container 1, see that it links to the config_1 directory
    $ docker exec volume-per-scaled-container_app_1 ls -l /etc/config
    lrwxrwxrwx    1 root     root            16 Jan 13 00:01 /etc/config -> /config/config_1
    
    # Container 2
    $ docker exec volume-per-scaled-container_app_2 ls -l /etc/config
    lrwxrwxrwx    1 root     root            16 Jan 13 00:01 /etc/config -> /config/config_2
    
    # Container 3
    $ docker exec volume-per-scaled-container_app_3 ls -l /etc/config
    lrwxrwxrwx    1 root     root            16 Jan 13 00:01 /etc/config -> /config/config_3
    

    注意事项

    • 我认为 gitlab/gitlab-runner 有自己的入口点文件,因此您可能需要链接它们。
    • 您需要根据您的具体设置/位置调整此示例。

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多