Dockerfile'da docker konteynerleri için bash takma adları nasıl ayarlanır?


87

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?


takma adlar aslında çok uzun bir süredir kullanımdan kaldırılmış olarak kabul edildi . Bir işlev kullanın. İçin artık gerek yoktur hiç bir takma ad kullanın. 80'lerin sonundaki bu yaklaşımlar nasıl bu kadar uzun süre devam ediyor?
William Pursell

19
Elbette kullanışlı ve basit oldukları için.
Arthur

13
@WilliamPursell Belki de bunun yerine işlevleri nasıl kullanacağınızı açıklamalısınız.
Eric Dela Cruz

2
Takma adlar basit, kullanışlı, kırılgan ve hataya açıktır. İşlevlerin kullanımı da aynı derecede kolaydır, ancak daha fazla esneklik ve sağlamlık sağlar. Bunların nasıl kullanılacağına dair birçok kaynak var.
William Pursell

Yanıtlar:


144

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

Bunun için teşekkürler, etkileşimli olmayan bir kabuk örneği verebilir misiniz? Bunu çözmek için ENTRYPOINT ve CMD arıyordum
c24b

5
Bash takma adı yalnızca etkileşimli kabuklarda çalışır. Sadece küçük bir kabuk betiği oluşturun ve bir takma adla aynı etkiyi yolunuza koyun. Cevabı basit bir örnekle güncelledi.
Erik Dannenberg

1
Not: stackoverflow.com/a/8467449 adresinde , daha tutarlı davranış sağlamak için echo yerine printf kullanmanız gerekir . Yani printf '#! / Bin / bash \ necho merhaba'> / usr / bin / hi chmod + x / usr / bin / hi
barraq

2
Kabuk betiği fikrini seviyorum. Takma adlar eklemek istiyordu ama bu çok daha iyi. Teşekkürler.
Blizz

3
Birden fazla bağımsız değişken için $ * yerine "$ @" kullanmalısınız. Bkz. Unix.stackexchange.com/questions/248464/…
gnou

14

Mevcut bir komutun takma adını oluşturmak için ln -sşunları da kullanabilirsiniz :

ln -s $(which <existing_command>) /usr/bin/<my_command>


7
Ben buna takma ad demezdim .. bu bir soft link / symlink. Takma adların rahatlığı, alias ll='ls -lh'sembolik bağlarla mümkün olmayan gibi komuta parametreleri aktarabilmenizdir .
qwertz

3

Takma adları yalnızca Dockerfile'da kullanmak, ancak kapsayıcı içinde kullanmak istemiyorsanız, en kısa yol ENVbildirimdir:

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.


2

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.shsadece ö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


1

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)


Bazı Docker görüntüsünün zaten varsayılan giriş noktasını (phusion temel görüntüsü gibi) geçersiz kılabileceğine dikkat edin.
Thomas Decaux

1

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

0

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.


Her RUNkomut 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.
Erik Dannenberg

% 100 @ErikDannenberg yorumunuz için ve ayrıca bana bununla ilgili bir güncelleme yayınlamam gerektiğini hatırlattığınız için teşekkür ederim - bir çözüm buldum ve önerdiğiniz gibi.
alanionita

0

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

-1
  1. bu dosyayı düzenleyin ~ / .bash_aliases vi ~/.bash_aliases
  2. bu dosyayı kaynakla ~ / .bash_aliases source ~/.bash_aliases
  3. bitti.

Docker konteynerinizi her açtığınızda bu sorun değil, ancak takma adlar bir dahaki sefere kalmayacak. eğer sakıncası yoksa bu çözüm her seferinde yeniden eklemektir.
mikoop

Bu bir cevap değil, soruyu soran kişiyle alay etmektir.
bhuvin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.