Ich bin neu bei Docker. Ich fand heraus, dass wir Umgebungsvariablen mithilfe der ENV-Anweisung in der Docker-Datei festlegen können. Aber wie setzt man Bash-Aliase für lange Befehle in Dockerfile?
Ich bin neu bei Docker. Ich fand heraus, dass wir Umgebungsvariablen mithilfe der ENV-Anweisung in der Docker-Datei festlegen können. Aber wie setzt man Bash-Aliase für lange Befehle in Dockerfile?
Antworten:
Grundsätzlich wie immer, indem Sie es dem Benutzer hinzufügen .bashrc
:
FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc
Wie üblich funktioniert dies nur für interaktive Shells:
docker build -t test .
docker run -it --rm --entrypoint /bin/bash test hi
/bin/bash: hi: No such file or directory
docker run -it --rm test bash
$ hi
hello
Für nicht interaktive Shells sollten Sie ein kleines Skript erstellen und es in Ihren Pfad einfügen, dh:
RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Wenn Ihr Alias Parameter verwendet (z. B. hi Jim
-> hello Jim
), fügen Sie einfach Folgendes hinzu "$@"
:
RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Verwenden Sie zum Erstellen eines Alias eines vorhandenen Befehls möglicherweise auch Folgendes ln -s
:
ln -s $(which <existing_command>) /usr/bin/<my_command>
alias ll='ls -lh'
dies mit Symlinks nicht möglich ist.
Wenn Sie Aliase nur in Dockerfile verwenden möchten, jedoch nicht im Container, ist der kürzeste Weg die ENV
Deklaration:
ENV update='apt-get update -qq'
ENV install='apt-get install -qq'
RUN $update && $install apt-utils \
curl \
gnupg \
python3.6
Und zur Verwendung in Containern wie bereits beschrieben:
RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
RUN chmod +x /usr/bin/install
Die meiste Zeit verwende ich Aliase nur auf der Bauphase und gehe nicht in Container, daher ist das erste Beispiel für den täglichen Gebrauch schneller, klarer und einfacher.
Ich habe dies gerade zu meiner app.dockerfile hinzugefügt
# setup aliases
ADD ./bashrc_alias.sh /usr/sbin/bashrc_alias.sh
ADD ./initbash_profile.sh /usr/sbin/initbash_profile
RUN chmod +x /usr/sbin/initbash_profile
RUN /bin/bash -C "/usr/sbin/initbash_profile"
und innerhalb der, initbash_profile.sh
die nur meine benutzerdefinierten Aliase anfügt und keine Notwendigkeit, die .bashrc-Datei zu quellen.
# add the bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc
hat ein Vergnügen gemacht!
Eine andere Möglichkeit besteht darin, einfach den Befehl "docker exec -it" von außerhalb des Containers zu verwenden und einfach Ihre eigene .bashrc oder das .bash_profile zu verwenden (was auch immer Sie bevorzugen).
z.B. docker exec -it docker_app_1 bash
Sie können den Einstiegspunkt in Ihrer Docker-Datei verwenden, dies funktioniert jedoch nicht für Alias:
ADD dev/entrypoint.sh /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]
Ihre entrypoint.sh
#!/bin/bash
set -e
function dev_run()
{
}
export -f dev_run
exec "$@"
(Schnelles Kopieren / Einfügen, sorry)
Ich denke, der einfachste Weg wäre, eine Datei in Ihren Container zu mounten, die Ihre Aliase enthält, und dann anzugeben, wo bash sie finden soll:
docker run \
-it \
--rm \
-v ~/.bash_aliases:/tmp/.bash_aliases \
[image] \
/bin/bash --init-file /tmp/.bash_aliases
Beispielnutzung:
user@cobalt:~$ echo 'alias what="echo it works"' > my_aliases
user@cobalt:~$ docker run -it --rm -v ~/my_aliases:/tmp/my_aliases ubuntu:18.04 /bin/bash --init-file /tmp/my_aliases
root@565e4a1bdcc0:/# alias
alias what='echo it works'
root@565e4a1bdcc0:/# what
it works
vi ~/.bash_aliases
source ~/.bash_aliases
Einige der oben genannten Lösungen wurden verwendet, aber die Aliase werden noch nicht erkannt.
Ich versuche, Aliase festzulegen und sie sowohl in späteren Dockerfile-Schritten als auch zur Laufzeit im Container zu verwenden.
RUN echo "alias model-downloader='python3 ${MODEL_DL_PATH}/downloader.py'" >> ~/.bash_aliases && \
echo "alias model-converter='python3 ${MODEL_DL_PATH}/converter.py'" >> ~/.bash_aliases && \
source ~/.bash_aliases
# Download the model
RUN model-downloader --name $MODEL_NAME -o $MODEL_DIR --precisions $MODEL_PRECISION;
Die Lösung für mich bestand darin, ENV-Variablen zu verwenden, die Ordnerpfade enthielten, und dann die genaue ausführbare Datei hinzuzufügen. Ich hätte auch ARG verwenden können, aber für mehr meiner Szenarien benötigte ich die Aliase sowohl in der Erstellungsphase als auch später in der Laufzeit.
Verwendet die ENV-Variablen in Verbindung mit einem Bash-Skript, das ausgeführt wird, sobald Abhängigkeiten verschoben wurden, und legt die Bash-Quelle fest, legt einige weitere env-Variablen fest und ermöglicht das Durchleiten weiterer Befehle.
RUN
Anweisung wird in einer neuen Shell ausgeführt, sodass in Ihrem Beispiel die Aliasdatei nicht mehr geladen wird, wenn Sie versuchen, den Alias zu verwenden.
Hier ist eine Bash-Funktion, mit der Sie Ihre Aliase in jedem Container haben, den Sie interaktiv verwenden.
ducker_it() {
docker cp ~/bin/alias.sh "$1":/tmp
docker exec -it "$1" /bin/bash -c "[[ ! -f /tmp/alias.sh.done ]] \
&& [[ -w /root/.bashrc ]] \
&& cat /tmp/alias.sh >> /root/.bashrc \
&& touch /tmp/alias.sh.done"
docker exec -it "$1" /bin/bash
}
Erforderlicher Schritt vor:
grep ^alias ~/.zshrc > ~/bin/alias.sh