Docker'da yeniyim. Dockerfile'daki ENV komutunu kullanarak ortam değişkenlerini ayarlayabileceğimizi buldum. Ancak Dockerfile'da uzun komutlar için bash takma adları nasıl ayarlanır?
Docker'da yeniyim. Dockerfile'daki ENV komutunu kullanarak ortam değişkenlerini ayarlayabileceğimizi buldum. Ancak Dockerfile'da uzun komutlar için bash takma adları nasıl ayarlanır?
Yanıtlar:
Temel olarak, her zaman yaptığınız gibi, bunu kullanıcının .bashrc
:
FROM foo
RUN echo 'alias hi="echo hello"' >> ~/.bashrc
Her zamanki gibi, bu yalnızca etkileşimli mermiler için çalışacaktır:
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
Etkileşimli olmayan kabuklar için küçük bir komut dosyası oluşturmalı ve bunu yolunuza koymalısınız, yani:
RUN echo -e '#!/bin/bash\necho hello' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Takma adınız parametreler (ör. hi Jim
-> hello Jim
) kullanıyorsa, şunu eklemeniz yeterlidir "$@"
:
RUN echo -e '#!/bin/bash\necho hello "$@"' > /usr/bin/hi && \
chmod +x /usr/bin/hi
Mevcut bir komutun takma adını oluşturmak için ln -s
şunları da kullanabilirsiniz :
ln -s $(which <existing_command>) /usr/bin/<my_command>
alias ll='ls -lh'
sembolik bağlarla mümkün olmayan gibi komuta parametreleri aktarabilmenizdir .
Takma adları yalnızca Dockerfile'da kullanmak, ancak kapsayıcı içinde kullanmak istemiyorsanız, en kısa yol ENV
bildirimdir:
ENV update='apt-get update -qq'
ENV install='apt-get install -qq'
RUN $update && $install apt-utils \
curl \
gnupg \
python3.6
Ve daha önce anlatıldığı gibi kapta kullanım için:
RUN printf '#!/bin/bash \n $(which apt-get) install -qq $@' > /usr/bin/install
RUN chmod +x /usr/bin/install
Çoğu zaman takma adları sadece yapım aşamasında kullanıyorum ve kapların içine girmiyorum, bu nedenle ilk örnek günlük kullanım için daha hızlı, daha net ve daha basit.
Bunu app.dockerfile dosyama ekledim
# 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"
ve initbash_profile.sh
sadece özel takma adlarımı ekleyen ve .bashrc dosyasını kaynaklamaya gerek yok.
# add the bash aliases
cat /usr/sbin/bashrc_alias.sh >> ~/.bashrc
bir tedavi çalıştı!
Diğer bir seçenek de, konteynerin dışından "docker exec -it komutunu" kullanmak ve sadece kendi .bashrc veya .bash_profile (ne tercih ederseniz edin) kullanmaktır.
Örneğin. docker exec -it docker_app_1 bash
Dockerfile'ınızda giriş noktası kullanabilirsiniz, ancak takma ad için çalışmayacaktır:
ADD dev/entrypoint.sh /opt/entrypoint.sh
ENTRYPOINT ["/opt/entrypoint.sh"]
Sizin entrypoint.sh
#!/bin/bash
set -e
function dev_run()
{
}
export -f dev_run
exec "$@"
(Hızlı kopyala / yapıştır, üzgünüm)
Sanırım en kolay yol, takma adlarınızı içeren kapsayıcınıza bir dosya eklemek ve ardından bash'ın onu nerede bulacağını belirtmek olacaktır:
docker run \
-it \
--rm \
-v ~/.bash_aliases:/tmp/.bash_aliases \
[image] \
/bin/bash --init-file /tmp/.bash_aliases
Örnek kullanım:
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
Yukarıdaki çözümlerden bazılarını kullandı, ancak takma adlar hala tanınmıyor.
Takma adlar ayarlamaya ve bunları hem daha sonraki Dockerfile adımlarında hem de çalışma zamanında kapsayıcıda kullanmaya çalışıyorum.
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;
Benim için çözüm, klasör yollarını tutan ENV değişkenlerini kullanmak ve ardından tam olarak yürütülebilir dosyayı eklemekti. ARG'yi de kullanabilirdim, ancak daha fazla senaryo için hem derleme aşamasında hem de daha sonra çalışma zamanında takma adlara ihtiyacım vardı.
ENV değişkenlerini, bağımlılıklar çözüldükten sonra çalışan ve bash kaynağını ayarlayan, daha fazla env değişkenleri ayarlayan ve daha fazla komutun yönlendirilmesine izin veren bir bash betiği ile birlikte kullanılır.
RUN
komut yeni bir kabukta yürütülür, bu nedenle örneğinizde, takma adı kullanmaya çalıştığınızda artık takma ad dosyası yüklenmez.
Etkileşimli olarak kullandığınız her kapta takma adlarınıza sahip olmak için bir Bash işlevi.
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
}
Bundan önce gerekli adım:
grep ^alias ~/.zshrc > ~/bin/alias.sh
vi ~/.bash_aliases
source ~/.bash_aliases