Eksekutif Docker tidak memuat alias

4

Saya memiliki alias pesta yang dimuat ke wadah Docker, di /etc/bash.bashrc. Fungsinya sebagai pintasan ke skrip PHP baris perintah. Ini nyaman, karena siapa pun dapat menggunakan alias itu langsung setelah satu log ke dalam wadah, dengan:

$ docker exec -it my-container bash

Namun, saya juga ingin dapat menggunakan alias ini dalam satu perintah tanpa masuk, seperti:

$ docker exec -it my-container my-alias

Saya telah mencoba variasi yang berbeda, seperti mendefinisikan alias di tempat lain selain /etc/bash.bashrc, tetapi saya tetap mengalami kesalahan ini:

rpc error: code = 2 desc = kesalahan runtime oci: exec gagal: exec: "my-alias": file yang dapat dieksekusi tidak ditemukan dalam $ PATH

Saran lain yang saya temukan di web tidak melakukan trik, sejauh ini. Siapa saja?

David Spreekmeester
sumber
Buat skrip dalam wadah, dan panggil skrip dengan nama path lengkap?
bgStack15
Itu pasti ide yang bagus untuk solusi, terima kasih! Namun saya bertanya-tanya mengapa sebuah alias dengan sendirinya tidak diambil dalam konteks ini. Saya pikir itu harus, karena sudah masuk /etc/bash.bashrc, dan bukan berdasarkan login .profile.
David Spreekmeester
Sudahkah Anda mencoba mengekspor alias-saya sebagai variabel lingkungan lalu menggunakan yang berikut? docker exec -it-my-container $ my-alias
joat
Apa yang Anda coba agak terbatas. Alias ​​Bash memungkinkan Anda mendeklarasikan alias untuk seluruh baris perintah. Ini mungkin atau mungkin tidak berfungsi (milik Anda tidak) ketika Anda membuat alias untuk bagian-bagian dari baris perintah. Mengekspor alias saya sebagai variabel lingkungan untuk sesi bash mungkin merupakan pendekatan yang lebih baik.
joat

Jawaban:

2

Itu bukan karena keterbatasan karena alias yang dimaksudkan untuk digunakan secara interaktif. Anda mungkin dapat meretas ini tetapi solusi termudah adalah dengan hanya membuat "alias" Anda menjadi skrip dan letakkan di dalamnya /bin.

Dockerfile

RUN echo '#! /bin/sh'                >> /bin/mycommand
RUN echo 'echo "running mycommand!"' >> /bin/mycommand
RUN chmod u+x /bin/mycommand

Maka itu berfungsi seperti yang diharapkan

docker exec -it f3a34 mycommand # => running mycommand!
Pithikos
sumber
0

Akhirnya saya mengambil pendekatan yang sedikit berbeda, karena saya belum berhasil membuatnya bekerja dengan bash.bashrcstrategi. @ joat benar, alias mungkin merupakan kombinasi yang tidak menguntungkan dengan eksekusi sebagian dari baris perintah (dengan docker exec).

Pada akhirnya, saya menyuntikkan skrip (dalam kasus saya melalui PHP Composer) ke dalam gambar. Dalam kasus saya dengan memasang direktori lokal saya, meskipun itu tidak masalah. Lalu saya menambahkan path ke skrip ini di saya Dockerfilemelalui variabel lingkungan:

ENV PATH $PATH:./vendor/bin

Ini membuat skrip tersedia secara global saat runtime.

Saya menganggapnya sebagai solusi, masih, jadi tertarik untuk mendengar dari siapa pun yang benar-benar mendapatkan alias reguler untuk bekerja saat docker execruntime.

David Spreekmeester
sumber
1
Tolong jelaskan secara spesifik apa solusinya. Saya membaca jawaban Anda 5 kali dan saya masih tidak tahu apa solusinya.
Ramhound
@Ramhound: Maaf tentang itu, Anda benar. Melakukan beberapa penggalian dan saya menemukan bahwa solusi akhirnya sebenarnya sedikit berbeda. Akan memperbarui jawabannya sekarang.
David Spreekmeester
0

Saya punya masalah ini dan saya menyelesaikannya dengan membungkus perintah yang ingin saya jalankan di dalam shell sementara, dalam contoh Anda memilikinya akan dilakukan seperti ini:

$ docker exec -it my-container sh -l -c "my-alias"

( -lbendera hanya diperlukan jika alias Anda hanya tersedia di shell login, yang merupakan kasus saya)

Itu membuatnya lebih verbose, tetapi Anda selalu dapat membuat alias atau fungsi untuk membungkus ini.

Noel De Martin
sumber
0

Alias ​​sebagian besar berguna ketika Anda ingin mempersingkat bagian dari perintah yang biasa digunakan yang mengambil argumen variabel. Dalam konteks ruby ​​dev yang mungkin membuat alias

alias be="bundle exec"

karena siapa yang mau mengetik bundle execsepanjang waktu?

Jika yang Anda inginkan adalah versi yang lebih pendek dari perintah yang lebih panjang dengan argumen statis maka Anda harus tetap membuat skrip. Dengan skrip, skrip akan selalu tersedia dan tidak bergantung pada sumber profil tertentu dalam konteks tertentu (yang pada dasarnya tidak dapat Anda andalkan).

Kasus comman yang lebih (seperti itu di atas) adalah ketika Anda menggunakan alias karena Anda ingin argumen string yang mudah ke akhir alias. Misalnya

$ be rails server

atau

$ be rake db:migrate

Dalam kedua kasus, saya tidak ingin harus mengetik lebih dari yang saya butuhkan. Namun, hanya dengan sedikit bash, Anda dapat mencapai hal yang sama dalam solusi yang lebih fleksibel.

Mirip dengan beberapa jawaban di atas, buat file - /usr/local/bin/bedalam contoh ini. Ini mengasumsikan bahwa /usr/local/bintermasuk dalam Anda PATH.

#!/usr/bin/env bash

bundle exec "$@"

ditindaklanjuti dengan (mungkin dengan sudo)

$ chmod +x /usr/local/bin/be

Ini sedikit contoh naif, dan mengharuskan keduanya rubydan bundlerpermata telah diinstal, tetapi hal yang perlu diperhatikan adalah "$@"yang memungkinkan Anda memasukkan sejumlah variabel argumen ke dalam skrip. Dengan demikian, Anda mendapatkan ergonomi alias, tetapi dengan perintah yang selalu tersedia dan tidak tergantung konteks.

Saya menemukan pendekatan ini sangat membantu ketika bekerja dengan wadah. Semoga ini bisa membantu.

jamesconant
sumber
Anda harus selalu memasukkan $@(dan variabel shell lainnya) dalam tanda kutip: yaitu bundle exec "$@",.
Scott
Terima kasih telah menunjukkannya. Saya pergi ke depan dan memperbarui karena kebiasaan yang baik, tetapi dalam hal ini, bagaimanapun, itu tidak sepenuhnya diperlukan.
jamesconant