Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Dockerfiles et bash et zsh


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Dockerfiles et bash et zsh
    Bonjour tout le monde,

    J'ai quelques soucis avec un dockerfiles, que j'essaye de construire (si je me suis trompé de section, n'hesitez pas à changer).

    Je lance une copilation de mon dockfiles et j'ai les erreurs suivantes ( qui sont dû à priori à la différence entre bash et le shell classique), malheureusement je n'arrive pas à comprendre ce que je dois faire pour résoudre ce soucis...


    voici mon code dockfiles

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    FROM ______
    ENV TZ=Europe/Paris
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh 
    RUN apt-get update -y \
    && apt-get install git lsb-release curl -yq \
    && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'\
    && apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 \
    && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - \
    && apt update \
    && apt-get -y install ros-melodic-desktop-full  \
    && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
    && source ~/.bashrc \
    && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc \
    && source ~/.zshrc \
    # && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -yq \
    # && apt install python-rosdep -yq \
    # && rosdep init \
    # && rosdep update \
    && apt-get clean -y
    ADD . /app/
    WORKDIR /app
    EXPOSE 2368
    VOLUME /app/logs/


    [QUOTE]/opt/ros/melodic/setup.zsh: line 7: cd: -q: invalid option
    cd: usage: cd [-L|[-P [-e]] [-@]] [dir]
    /opt/ros/melodic/setup.zsh: line 8: emulate: command not found
    The command '/bin/sh -c apt-get update -y && apt-get install git lsb-release curl -yq && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'&& apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - && apt update && apt-get -y install ros-melodic-desktop-full && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc && source ~/.bashrc && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc && source ~/.zshrc && apt-get clean -y' returned a non-zero code: 127
    zsh: aucun fichier ou dossier de ce type: /opt/ros/melodic/setup.zsh:
    zsh: bad pattern: [-P zsh: bad pattern: [-L [1] 21880 exit 1 cd: usage: cd [-L [/QUOTE]

  2. #2
    Expert éminent sénior
    Bonjour

    Tu as tout. "cd" n'a pas d'option "-q" dans bash mais peut en avoir une en zsh. Donc 2 voies :
    • Soit tu enlèves l'option -q de tes scripts.
    • Soit tu expliques à ton système quel est le bon interpréteur de commande.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre régulier
    Je te remercie pour ces explications
    J'ai retiré le q de la ligne 7.
    Mais l'erreur est toujours présente ...


    Comment je peux indiquer à mon système que elle est le bon interpreteur. J'ai vu la commande shell dans les dockerfile mais pas directement à linux.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    FROM _______
    ENV TZ=Europe/Paris
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh 
    RUN apt-get update -y \
    && apt-get install git lsb-release curl -y \
    && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'\
    && apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 \
    && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - \
    && apt update \
    && apt-get -y install ros-melodic-desktop-full  \
    && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
    && source ~/.bashrc \
    && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc \
    && source ~/.zshrc \
    && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y \
    && apt install python-rosdep -y \
    #&& rosdep init \
    #&& rosdep update \
    #mkdir /home/cellule \      
    #cd /home/cellule \        
    #&& git clone https://github.com/aip-primeca-occitanie/aip_cellule_flexible.git \
    && apt-get clean -y 
    ADD . /app/
    WORKDIR /home/cellule
    EXPOSE 2368
    VOLUME /app/logs


    /opt/ros/melodic/setup.zsh: line 7: cd: -q: invalid option
    cd: usage: cd [-L|[-P [-e]] [-@]] [dir]
    /opt/ros/melodic/setup.zsh: line 8: emulate: command not found
    The command '/bin/sh -c apt-get update -y && apt-get install git lsb-release curl -y && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'&& apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - && apt update && apt-get -y install ros-melodic-desktop-full && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc && source ~/.bashrc && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc && source ~/.zshrc && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y && apt install python-rosdep -y && apt-get clean -y' returned a non-zero code: 127

  4. #4
    Modérateur

    Bonjour,

    on peut configurer python pour être l'interpréteur de connexion d'un utilisateur.
    alors, ton script, sh, bash ou zsh ne fonctionnera plus du tout.

    mets un shebang en haut de ton script.
    pour des environnements non standardisés, utilise un syntaxe strictement POSIX, et indique-le en ajoutant #!/bin/sh au tout début du script.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Membre régulier
    Bonjour
    J'ai cru comprendre que le shell posix était le shell de base pour unix (si je ne me trompe pas).
    Il ne trouve pas l'instruction shebang, sinon moi je désire utiliser docker bluild -t essai 1.0 . Par exemple...
    Si je me un #!/bin/sh il va fonctionner pour le bash (sans mettre le lien symbolique du coup) ?
    Je pose sans doute des questions triviales, mais je galère un peu ...

  6. #6
    Modérateur

    le shell par défaut, ça dépend de la configuration de l'utilisateur (lors de la création de son profile, ou a posteriori (après chsh)).

    si tu n'indiques pas formellement au début du script quel shell utiliser,
    ça peux être n'importe quoi,
    ou pire.


    quand on n'est pas sûr, on met #!/bin/sh, et on écrit le script en respectant strictement la norme POSIX.
    ainsi, quelque soit le lien /bin/sh, il pointera nécessairement vers un shell conforme à cette norme.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Membre régulier
    J'ai mis la commande après FROM

    Step 1/9 : FROM ________
    ---> 20862ac64e0d
    Step 2/9 : RUN #!/bin/sh
    ---> Running in e86ea332e4c8
    Removing intermediate container e86ea332e4c8
    ---> bb12cf13d11d
    mais au moment de la restitution du build

    /bin/sh: 1: source: not found
    The command '/bin/sh -c apt-get update -y && apt-get install git lsb-release curl -y && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'&& apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - && apt update && apt-get -y install ros-melodic-desktop-full && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc && source ~/.bashrc && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc && source ~/.zshrc && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y && apt install python-rosdep -y && apt-get clean -y' returned a non-zero code: 127

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    FROM ________
    RUN #!/bin/sh
    ENV TZ=Europe/Paris
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # RUN rm /bin/sh && ln -s /bin/bash /bin/sh 
    RUN apt-get update -y \
    && apt-get install git lsb-release curl -y \
    && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'\
    && apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 \
    && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - \
    && apt update \
    && apt-get -y install ros-melodic-desktop-full  \
    && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
    && source ~/.bashrc \
    && echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc \
    && source ~/.zshrc \
    && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y \
    && apt install python-rosdep -y \
    #&& rosdep init \
    #&& rosdep update \
    #mkdir /home/cellule \      
    #cd /home/cellule \        
    #&& git clone https://github.com/aip-primeca-occitanie/aip_cellule_flexible.git \
    && apt-get clean -y 
    ADD . /app/
    WORKDIR /home/cellule
    EXPOSE 2368
    VOLUME /app/logs


    J'ai modifié le dockfile

    && echo ". /opt/ros/melodic/setup.sh" >> ~/.bashrc \
    && . ./.bashrc \

    Mais il me dit

    /bin/sh: 1: .: Can't open ./.bashrc

  8. #8
    Modérateur

    comme dit ailleurs, source n'est pas POSIX.

    mais, ce n'est pas un script shell !
    le shebang est inutile, puisqu'il n'est pas au début d'un script shell, ce n'est qu'un commentaire.

    ah, mais alors, c'est quoi un dockfile ?
    et quel est son environnement d'exécution ?
    est-il possible de définir le shell employé ?

    si c'est simplement /bin/sh, il devrait suffire de conformer ton code à la norme POSIX.

    ou alors, tu écrit un script avec un shebang, et tu fais un RUN /chemin/tonScript, après avoir rendu tonScript exécutable.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Expert éminent sénior
    Reprenons. Un script est un texte qui sera interprété. La question est de savoir par quoi.



    J'espère que c'est plus clair.
    Mets un shebang.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Responsable Systèmes

    ah, mais alors, c'est quoi un dockfile ?
    c'est dockerfile. Il s'agit d'un fichier pour générer un conteneur Docker. C'est une suite d'instructions exécuté dans le conteneur, mais ce n'est pas un script shell (c'en est presque un si tu vires RUN et templace les autres directives représentés par les mots majuscules en équivalent bash), donc pas de shebang.

    est-il possible de définir le shell employé ?
    En général, ton dockerfile va s'appuyer sur une image Docker existante. La nouvelle image de conteneur que tu vas créer correspondra au delta du Docker de base appliqué par le dockerfile. Tu auras donc le(s) shell(s) fourni par l'image de base. Ton dockerfile peut en ajouter un, ou en retirer un.
    Tu peux partir from scratch depuis un debootstrap plutôt que de te baser sur un docker image existant.

    Tu peux voir Docker comme un chroot évolué permettant la virtualisation d'application/service. (plus léger qu'une VM, partageant le noyau de l'hôte, contrairement à une VM, qui elle virtualise tout un OS).
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Membre régulier
    Bonjour tous le monde,
    Je suis désolé, je viens de m'apercevor que j'ai mis dockfle au lieu de dockerfile comme à préciser chrtophe.
    Du coup, j'ai du mal à savoir ce que je dois mettre pour faire exécuter ce docker. C'est pour faire tourner ROS (logciel uniquement linux en beta windows) et je souhaite comme dit chrtophe, y faire tourner ROS. Simplement comme ll s'agit de le faire tourner sur plusieurs ordinateur, et aussi en distanciation (au vu des petits soucis que l'on a de covid).
    Bref, j'ai réussi, en cherchant à solutionner les problèmes de d'horloge, mais je bute toujours au moment du docker bluid sur le bachrc ou le zshrc. Le premier pouvait être contourner avec la ligne :

    RUN rm /bin/sh && ln -s /bin/bash /bin/sh

    Mais pour le zshrc, je ne vois pas trop puisque je ne peux le déclarer au dessus vu qu'il n'est pas créer avant.

    Encore désolé, pour l'erreur de frappe .

    Donc je suis allé plus en avant dans le docker, en faites j'ai le choix soit zrch ou le basrhrc, comme environnement.

    Par sans utiliser la ligne
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh

    Que devrais je modifier pour la rendre cohérent avec le shell posix.
    Enfin merci pour tous les renseignements.

  12. #12
    Modérateur

    pourquoi veux-tu sourcer .bashrc ?
    .bashrc est sourcé lors de l'ouverture d'une session.

    de plus, le code montre ~/.bashrc, alors que le message d'erreur parle de ./.bashrc.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  13. #13
    Membre régulier
    En faites pour installer ROS, il est demandé de mettre ses lignes pour compléter l'environnement de ROS.


    It's convenient if the ROS environment variables are automatically added to your bash session every time a new shell is launched:

    echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    Du coup, j'ai ajouté à mon dockerfile les lignes suivante :

    && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
    && source ~/.bashrc \
    Et au moment de compiler le docker build

    J'avais une erreur de command introuvable

    J'ai cherché comment trouver une solution (et qui comme vous l'avez indiqué me disais que le langage est du shell posix et non du bash).

    Il était d'ajouter les lignes suivantes :

    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    Mais que cette solution n'est pas idéale, que je ferrai mieux de réecrire en posix ma commande :
    J'ai essayé de mettre la commande :

    && echo ". /opt/ros/melodic/setup.sh" >> ./.bashrc \
    && . ./.sh \
    J'ai eu l'erreur susmentionné au dessus :

    /bin/sh: 1: .: Can't open ./.bashrc
    Je suppose que je dois me tromper sur ce que je dois faire.

  14. #14
    Modérateur

    le point, dans un chemin (le premier dans ./.bashrc) indique le répertoire courant, lors de l'exécution.

    si j'ai bien compris, un dockerfile construit un dock, mais ne démarre pas cet environnement;
    alors sourcer l'environnement du shell, a fortiori plusieurs shells (bash ET zsh), est inutile.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  15. #15
    Responsable Systèmes


    si j'ai bien compris, un dockerfile construit un dock
    Un dockerfile va générer une image docker : un template de conteneur.
    Tu vas ensuite créer un conteneur (une instance de l'image Docker) qui sera un delta du docker image.

    Tu créée une image Docker via un dockerfile. En gros, lors de la création de l'image, toutes les commandes du dockerfile sont exécutés dans le conteneur. En gros c'est un fichier servant au déploiement du docker.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  16. #16
    Membre régulier
    Merci à tous pour vos éclaircissements.
    Du coup, c'est à moi de choisir soit je gardes zsh ou bash... Après une fois la ligne de lien symbolique, "la compilation s'est passée correctement".
    Je mets le dockerfile que j'obtiens, si ça peut aider quelqu'un (notamment les histoires de tz data qui demande un lieu géographique et empeche une "compilation" silencieuse).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    FROM ________________________
    RUN #!/bin/sh
    ENV TZ=Europe/Paris
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh 
    RUN apt-get update -y \
    && apt-get install git lsb-release curl -y \
    && sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'\
    && apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 \
    && curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | apt-key add - \
    && apt update \
    && apt-get -y install ros-melodic-desktop-full  \
    && echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc \
    && source ~/.bashrc \
    && apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential -y \
    && rosdep init \
    #&& rosdep update \
    && mkdir /home/cellule \      
    && cd /home/cellule \        
    && git clone ______________________ \
    && git clone ___________________ \
    && apt-get clean -y 
    ADD . /app/
    WORKDIR /home/cellule

###raw>template_hook.ano_emploi###