Bash docker-compose.yml -> docker run Aufruf

n/a

Ensign
Registriert
Feb. 2025
Beiträge
170
Hallo,

ich suche hierzu (docker-compose.yml) den äquivalenten docker run-Aufruf:

Code:
services:
  build-mds:
    image: pandoc/extra:latest-ubuntu
    container_name: build-mds
    user: ${MY_UID}:${MY_GID}
    restart: no
    volumes:
      - ./data/:/data/
    entrypoint: ["/bin/sh", "-c", "/data/build_mds.sh /data/mds/ /data/pdfs/"]

docker run --rm --name build-mds --volume $(pwd):/data/ --user $(id -u):$(id -g) pandoc/extra:latest-ubuntu /data/build_mds.sh /data/mds/ /data/pdfs/ funktioniert leider nicht.

Ich denke, der Entrypoint des Images muss überschrieben werden.
 
Ich nach das gerne mit Chatgpt bzw. Copilot.

Funktioniert das:
Code:
docker run --name build-mds --user ${MY_UID}:${MY_GID} --restart no -v $(pwd)/data/:/data/ pandoc/extra:latest-ubuntu /bin/sh -c "/data/build_mds.sh /data/mds/ /data/pdfs/"
 
Also die PowerShell sagt mir Folgendes:

Code:
docker run --entrypoint "/data/build_mds.sh /data/mds/ /data/pdfs/" --rm --name build-mds --volume ${pwd}:/data/ pandoc/extra:latest-ubuntu

docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/data/build_mds.sh /data/mds/ /data/pdfs/": stat /data/build_mds.sh /data/mds/ /data/pdfs/: no such file or directory: unknown.
Ergänzung ()

A, jetzt hat's geklappt. :)

docker run --entrypoint /data/build_mds.sh --rm --name build-mds --volume ${pwd}:/data/ pandoc/extra:latest-ubuntu /data/mds/ /data/pdfs/
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: KillerCow
Nur mal so ganz doof gefragt: Warum lässt du einen Teil des "entrypoint" aus dem Composefile weg und hoffst dann, dass es trotzdem funktioniert 🤔 ;)

Soweit ich das noch im Kopf habe, ersetzen die Paramter nach dem Imagenamen nur den "CMD" Teil, aber nicht den im Image definierten Entrypoint. Um das zu erreichen, müsstest du vermutlich mit "--entrypoint" arbeiten.
Kann aber auch sein, dass das Image so gebaut ist, dass es bei übergebenen Parametern schlicht diese komplett als Entrypoint benutzt. Ich glaube, so sind die meisten Images in der heutigen Zeit gebaut. Damit sollte die Lösung von @Nebuk funktionieren... theoretisch ;)
 
Jo, der "Standard"entrypoint vom Pandoc-Image enthält einen "pandoc"-Aufruf, den ich gerne überschreiben möchte, weil ich "pandoc" im Container öfter aufrufen muss.

Chatgpt wie von Nebuk angemerkt hat mir da leider nicht geholfen.
 
Zuletzt bearbeitet:
Siehe @n/a , du musst offenbar den entrypoint überschreiben, mit "--entrypoint".
 
  • Gefällt mir
Reaktionen: n/a
@n/a Wie gesagt, den Rest der Konfiguration zieht er sich dann aus der docker-compose.yml, somit würde der Entrypoint auch ohne weiteren --entrypoint Parameter überschrieben werden, denn du hast den ja schon in der docker-compose.yml definiert:

Code:
entrypoint: ["/bin/sh", "-c", "/data/build_mds.sh /data/mds/ /data/pdfs/"]
Er nutzt den dann automatisch, sobald du statt docker run einfach docker compose run ausführst. Sorry, wenn das beim ersten mal nicht verständlich war.

Probiers doch mal aus:
Code:
docker compose run build-mds /data/build_mds.sh
 
  • Gefällt mir
Reaktionen: n/a
Aaa, jetzt verstehe ich. Dadurch kann ich das --entrypoint <...>-Argument-Gewurschtel einsparen. Das ist dann wirklich stringenter. Danke.
Ergänzung ()

aber bisher hab ich das mit docker compose up -d (+uid/gid) gemacht, das wäre so ähnlich.
 
n/a schrieb:
aber bisher hab ich das mit docker compose up -d (+uid/gid) gemacht, das wäre so ähnlich.
Das wäre nur in deinem Einzelfall ähnlich, wenn du NUR EINEN Service in der docker-compose.yml hättest, was grundsätzlich eher selten Sinn macht (es heißt ja compose, also zusammenstellen mehrerer Services). Sobald du mehrere Services hast, kannst du die mit docker compose up -d nicht mehr einzeln ansteuern, sondern nur alle gemeinsam starten. Außerdem sorgt das -d ja dafür, dass das ganze in den Hintergrund verlagert wird, was du ja auch nicht willst.
 
  • Gefällt mir
Reaktionen: n/a
sandreas schrieb:
wenn du NUR EINEN Service in der docker-compose.yml hättest,
In dem Fall ist das so...

Das Script zum Bauen sieht zurzeit so aus (Entrypoint der Compose):

Bash:
#!/bin/sh
set -e
for file in "$1"*; do
  bn=$(basename "$file")
  bn2=${bn%.*}
  pandoc --pdf-engine lualatex \
  -V mainfont:sourcesanspro -V sansfont:sourcesanspro -V monofont:sourcesanspro -V mathfont:sourcesanspro \
  -o "$2$bn2".pdf "$file"
done

Die docker-compose.yml hab ich oben schon gezeigt.

Der Aufruf erfolgt zurzeit auf Linux so:

MY_UID="$(id -u)" MY_GID="$(id -g)" docker compose up

und das Windows PowerShell Pendant ist:

PowerShell:
$Env:MY_UID = "$(id -u)"
$Env:MY_GID = "$(id -g)"
docker compose up
 
Zurück
Oben