Параллельное выполнение кода в контейнерах Docker - PullRequest
0 голосов
/ 08 мая 2019

У меня есть скрипт, который очищает данные по списку URL-адресов.Этот скрипт выполняется в контейнере Docker.Я хотел бы запустить его в нескольких экземплярах, например, 20. Для этого я хотел использовать docker-compose scale worker=20 и передавать INDEX каждому экземпляру, чтобы скрипт знал, какие URL-адреса должны быть удалены.

Пример.

ID, URL
0 https://example.org/sdga2
1 https://example.org/fsdh34
2 https://example.org/fs4h35
3 https://example.org/f1h36
4 https://example.org/fs4h37
...

Если имеется 3 экземпляра, 1-й экземпляр сценария должен обработать URL-адрес, идентификатор которого равен 0, 3, 6, 9, т. Е. ID = INDEX + INSTANCES_NUM * k.

Я не знаю, как передать INDEX скрипту, работающему в контейнере Docker.Конечно, я могу дублировать сервисы в docker-compose.yml с разными INDEX в среде vars.Но если число экземпляров больше 10 или даже 50, это будет очень плохое решение)

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

С docker-compose, Я не верю, что есть какая-либо поддержка для . Однако в режиме роя, в котором можно использовать аналогичный составной файл, вы можете передать {{.Task.Slot}} в качестве переменной среды, используя шаблоны служб . Э.Г.

version: '3'
services:
  test:
    image: busybox
    command: /bin/sh -c "echo My task number is $$task_id && tail -f /dev/null"
    environment:
      task_id: "{{.Task.Slot}}"
    deploy:
      replicas: 5

Вместо docker-compose up я развертываю с docker stack deploy -c docker-compose.yml test. Мой локальный роевой кластер - это всего лишь один узел, созданный с помощью docker swarm init.

Затем, просматривая каждый из этих работающих контейнеров:

$ docker ps --filter label=com.docker.swarm.service.name=test_test
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
ccd0dbebbcbe        busybox:latest      "/bin/sh -c 'echo My…"   About a minute ago   Up About a minute                       test_test.3.i3jg6qrg09wjmntq1q17690q4
bfaa22fa3342        busybox:latest      "/bin/sh -c 'echo My…"   About a minute ago   Up About a minute                       test_test.5.iur5kg6o3hn5wpmudmbx3gvy1
a372c0ce39a2        busybox:latest      "/bin/sh -c 'echo My…"   About a minute ago   Up About a minute                       test_test.4.rzmhyjnjk00qfs0ljpfyyjz73
0b47d19224f6        busybox:latest      "/bin/sh -c 'echo My…"   About a minute ago   Up About a minute                       test_test.1.tm97lz6dqmhl80dam6bsuvc8j
c968cb5dbb5f        busybox:latest      "/bin/sh -c 'echo My…"   About a minute ago   Up About a minute                       test_test.2.757e8evknx745120ih5lmhk34

$ docker ps --filter label=com.docker.swarm.service.name=test_test -q | xargs -n 1 docker logs
My task number is 3
My task number is 5
My task number is 4
My task number is 1
My task number is 2
0 голосов
/ 08 мая 2019

почему вы не используете базу данных?mysql или redis.

каждый контейнер может извлекать URL-адреса из базы данных, и вы можете пометить извлеченные URL-адреса как завершенные, всегда извлекая неполные URL-адреса из каждого контейнера.Это может масштабироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...