首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker-compose :具有不同主机体积映射的缩放容器

docker-compose :具有不同主机体积映射的缩放容器
EN

Stack Overflow用户
提问于 2022-01-12 20:21:05
回答 1查看 944关注 0票数 3
  1. 在这里,我部署了两个带有标尺标志的容器。
代码语言:javascript
复制
docker-compose up -d --scale gitlab-runner=2

2.部署了两个容器,它们的名称分别是names _gitlab_ resp _1和Scalecon流变_gitlab_2 resp。

  1. 我想为每个容器映射不同的音量。
代码语言:javascript
复制
/srv/gitlab-runner/config_${DOCKER_SCALE_NUM}:/etc/gitlab-runner
  1. 获取此错误:
代码语言:javascript
复制
WARNING: The DOCKER_SCALE_NUM variable is not set. Defaulting to a blank string.
  1. 有没有办法,我可以为不同的容器映射不同的体积。
代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-12 23:53:23

我认为你做不到,在这个这里上有一个公开的请求。在这里,我将尝试描述一种替代方法来获得您想要的东西。

尝试从容器中创建一个符号链接,链接到您想要的目录。您可以通过从docker读取容器名称并获取最终段来确定容器的“数量”。要做到这一点,您必须将对接器套接字挂载到容器中,容器中有重大安全问题

设置

下面是一个简单的脚本来获取容器的编号(Credit )。

get-name.sh

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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"]

最后,一个简单的组合文件,指定我们的服务。请注意,已挂载了对接器套接字,以及./config,这是我们不同的配置目录的位置。

docker-compose.yml

代码语言:javascript
复制
version: '3'

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

示例

代码语言:javascript
复制
# 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有自己的入口点文件,所以您可能需要链接它们。
  • 您需要根据特定的设置/位置调整此示例。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70687900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档