Zugriff auf SharedMemory in einem Gitlab -LäuferPython

Python-Programme
Anonymous
 Zugriff auf SharedMemory in einem Gitlab -Läufer

Post by Anonymous »

Ich schreibe einen Pytest, der durch gemeinsame Speicher mit Docker -Containern mitgeteilt werden soll. Lokal ist das ziemlich einfach zu erreichen, um so etwas zu verwenden: < /p>

Code: Select all

# Create a shared memory block
shm: SharedMemory = SharedMemory(create=True, name=shm_name, size=1e6)
# Create a docker mount for the shared memory
shm_mount = docker.types.Mount(source="/dev/shm", target="/dev/shm", type="bind")
# Run a container with access to the shared memory
client.containers.run(
image="alpine",
name="my_container",
detach=True,
remove=True,
command="tail -f /dev/null",
mounts=[shm_mount],
environment={
"SHM_NAME": shm_name
}
)
< /code>
Jetzt, wo der Test in einem GitLab -Läufer ausgeführt wird. Um den Docker SDK zu verwenden, verwende ich eine Docker-in-Docker-Konfiguration wie folgt:unittest:
image:
name: docker:27.0.2
pull_policy: if-not-present
tags:
- general-runner-dind
services:
- name: docker:27.0.2-dind
alias: docker-service
command: [dockerd-entrypoint.sh, --tls=0]
variables:
DOCKER_HOST: tcp://docker-service:2375
DOCKER_TLS_CERTDIR: ""
FF_NETWORK_PER_BUILD: "true"
before_script:
- apk update && apk upgrade && apk add --no-cache python3 python3-dev py3-pip curl
- curl -LsSf https://astral.sh/uv/0.6.17/install.sh | sh
- source $HOME/.local/bin/env
script:
- cd /path/to/project
- uv sync --frozen
- uv run --no-sync pytest
< /code>
Also läuft PyTest jetzt in einem Docker -Bild. Darüber hinaus ist die Steuerung der Parameter, mit der der Container in PyTest ausgeführt wird, eher begrenzt. Dinge, die ich versucht habe, ein gemeinsames Speicher in PyTest zu schreiben und mit anderen Docker -Containern mit dem Docker SDK zu teilen:

 Erkennen Sie die Container -ID des PyTest -Containers und [url=viewtopic.php?t=23808]übergeben[/url] Sie diese an ipc_mode 
option von docer. class = "Lang-Py PrettyPrint-Override">

Code: Select all

cid = get_container_id() # Some logic to get the container ID.
shm: SharedMemory = SharedMemory(create=True, name=shm_name, size=1e6)
if cid is None:
# Running on host
shm_mount = docker.types.Mount(source="/dev/shm", target="/dev/shm", type="bind")
mounts = [shm_mount]
ipc_mode = None
else:
# Running inside docker
mounts = []
ipc_mode = f"container:{cid}"
client.containers.run(
image="alpine",
name="my_container",
detach=True,
remove=True,
command="tail -f /dev/null",
mounts=mounts,
ipc_mode=ipc_mode
environment={
"SHM_NAME": shm_name
}
)
< /code>
Dies funktioniert nicht, da das Docker-in-Docker-Setup auf GitLab ziemlich spezialisiert zu sein scheint und alle Mittel, um die Container-ID zu erhalten/.dockerenv
existiert nicht oder/proc/self/cgroup (cgroups v1)/

Code: Select all

/proc/self/mountinfo< /code> (cgroups v2) scheint die Docker-Container-ID nicht zu enthalten).ipc_anchor = client.containers.run(
image="alpine",
name=ipc_anchor_name,
detach=True,
remove=True,
command="tail -f /dev/null",
ipc_mode="shareable",
)
ipc_mode = f"container:{ipc_anchor.id}"
Obwohl diese Option vielversprechend aussieht, ist es mir unklar, wie man den gemeinsam genutzten Speicher von PyTest zum Schreiben erreicht (mit SharedMemory (create = false, shm_name = ...) ). Oder ein anderer Ansatz, den ich noch fehlen könnte?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post