3 votes

Exécution d'un script personnalisé en utilisant le point d'entrée dans docker-compose

J'ai modifié le docker-compose.yml comme indiqué sur https://hub.docker.com/_/solr/ en ajoutant un volumes et un changement dans entrypoint . Le fichier modifié est le suivant :

version: '3'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - ./solr/init.sh:/init.sh
      - ./solr/data:/opt/solr/server/solr/mycores
    entrypoint:
      - init.sh
      - docker-entrypoint.sh
      - solr-precreate
      - mycore

J'ai besoin d'exécuter ce 'init.sh' avant le démarrage du point d'entrée, pour préparer mes fichiers dans le conteneur.

Mais je reçois les erreurs suivantes :

ERROR : pour solr_solr_1 Cannot start service solr : oci runtime error : container_linux.go:247 : démarrage du processus de conteneur causé par "exec : \"init.sh\" : fichier exécutable non trouvé dans $PATH"

Plus tôt, j'ai découvert les crochets d'image officiels dans neo4j à partir de aquí . Y a-t-il une chose similaire que je puisse utiliser ici aussi ?

Mise à jour 1 : D'après les commentaires ci-dessous, je me suis rendu compte que le dockerfile définit WORKDIR /opt/solr en raison de quoi executable file not found in $PATH . J'ai donc testé en fournissant le chemin absolu vers le point d'entrée en utilisant /init.sh . Mais cela donne aussi une erreur, mais une erreur différente :

standard_init_linux.go:178 : exec user process caused "exec format error"

4voto

gateblues Points 66

Il semble que vous ayez besoin de mapper votre volume à /docker-entrypoint-initdb.d/

version: '3'
services:
  solr:
    image: solr
    ports:
     - "8983:8983"
    volumes:
      - ./solr/init.sh:/docker-entrypoint-initdb.d/init.sh
      - ./solr/data:/opt/solr/server/solr/mycores
    entrypoint:
      - docker-entrypoint.sh
      - init

De

https://hub.docker.com/_/solr/

Extension de l'image L'image docker-solr possède un mécanisme d'extension. Au moment de l'exécution, avant de lancer Solr, le conteneur va exécute scripts dans le répertoire /docker-entrypoint-initdb.d/. Vous pouvez ajouter vos propres scripts là, soit en utilisant des volumes montés, soit en utilisant un Dockerfile personnalisé. Ces scripts peuvent par exemple copier un répertoire core avec des données préchargées pour les tests d'intégration continue, ou encore modifier la configuration de Solr.

Le docker-entrypoint.sh semble être responsable de l'exécution des sh scripts en fonction des arguments qui lui sont passés. Ainsi, init est le premier argument qui, à son tour, essaie d'exécuter init.sh.

docker-compose logs solr | head

Mise à jour 1 :

Je me suis battu pour que cela fonctionne et j'ai finalement compris pourquoi mon docker-compose ne fonctionnait pas alors que le docker run -v pointant vers le /docker-entrypoint-initdb.d/init.sh fonctionnait.

Il s'avère que la suppression de l'arbre des points d'entrée était la solution. Voici mon docker-compose final :

version: '3'
services:
  solr:
    image: solr:6.6-alpine
    ports:
     - "8983:8983"
    volumes:
      - ./solr/data/:/opt/solr/server/solr/
      - ./solr/config/init.sh:/docker-entrypoint-initdb.d/init.sh

mon ./solr/config/init.sh

#!/bin/bash
echo "running"
touch /opt/solr/server/solr/test.txt;
echo "test" > /opt/solr/server/solr/test.txt;

0voto

Aditya Gaur Points 1

Une solution alternative qui a fonctionné pour moi a été de modifier le point d'entrée en plaçant /bin/sh. Cela ressemblait un peu à ceci ensuite

`version: '3' services: web: build: . volumes: - .:/code entrypoint :

  • /bin/sh - ./test.sh ports: - "5000:5000` où test.sh est le bash script requis pour être exécuté à l'intérieur du conteneur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X