Docker 个容器中的并行代码执行
Parallel code execution in Docker containers
我有一个通过 URLslist 抓取数据的脚本。
此脚本在 docker 容器中执行。
我想在多个实例中 运行 它,例如 20。
为此,我想使用 docker-compose scale worker=20
并将 INDEX 传递给每个实例,以便脚本知道应该 scraped .
示例。
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 个实例,脚本的第一个实例应处理 ID 等于 0、3、6、9 的 url,即 ID = INDEX + INSTANCES_NUM * k.
我不知道如何将 INDEX 传递给 Docker 容器中的脚本 运行ning。
当然,我可以在环境变量中使用不同的 INDEX 复制 docker-compose.yml 中的服务。但如果实例数大于 10 甚至 50,这将是一个非常糟糕的解决方案)
有人知道怎么做吗?
你为什么不使用数据库? mysql 或者 redis.
每个容器都可以从数据库中获取 url,您可以将获取的 url 标记为完整,始终从每个容器中获取未完成的 url。这可以扩展。
与docker-compose
、I don't believe there's any support for this. However, with swarm mode, which can use a similar compose file, you can pass {{.Task.Slot}}
as an environment variable using service templates。例如
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 stack deploy -c docker-compose.yml test
部署而不是 docker-compose up
。我的本地 Swarm 集群只是使用 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
我有一个通过 URLslist 抓取数据的脚本。
此脚本在 docker 容器中执行。
我想在多个实例中 运行 它,例如 20。
为此,我想使用 docker-compose scale worker=20
并将 INDEX 传递给每个实例,以便脚本知道应该 scraped .
示例。
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 个实例,脚本的第一个实例应处理 ID 等于 0、3、6、9 的 url,即 ID = INDEX + INSTANCES_NUM * k.
我不知道如何将 INDEX 传递给 Docker 容器中的脚本 运行ning。 当然,我可以在环境变量中使用不同的 INDEX 复制 docker-compose.yml 中的服务。但如果实例数大于 10 甚至 50,这将是一个非常糟糕的解决方案)
有人知道怎么做吗?
你为什么不使用数据库? mysql 或者 redis.
每个容器都可以从数据库中获取 url,您可以将获取的 url 标记为完整,始终从每个容器中获取未完成的 url。这可以扩展。
与docker-compose
、I don't believe there's any support for this. However, with swarm mode, which can use a similar compose file, you can pass {{.Task.Slot}}
as an environment variable using service templates。例如
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 stack deploy -c docker-compose.yml test
部署而不是 docker-compose up
。我的本地 Swarm 集群只是使用 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