Cara menampilkan perintah run dari kontainer buruh pelabuhan

102

Saya menggunakan GUI pihak ketiga (paket Synology Docker) untuk menyiapkan wadah buruh pelabuhan. Namun, keterbatasan itu membuat saya perlu menjalankan container dari command line. (Saya ingin memetakan ip host lain untuk mengikat port)

Sekarang, karena ada banyak pengaturan yang sudah dilakukan, saya ingin mengambil perintah jalankan asli yang memulai penampung ini, kemudian saya dapat mengubah port pemetaan port ke yang baru. misalnya. " docker run -p 80:8080 gitlab"

Saya tidak dapat menemukan cara untuk melakukannya, acara menggunakan "buruh pelabuhan inspeksi", tidak ada informasi yang diberikan.

Mohon berikan beberapa saran untuk mengatasi masalah ini.

Jack Yu
sumber
6
@capitalistpug pertanyaan itu adalah kebalikan dari pertanyaan ini - ini tentang perintah di dalam container, ini tentang yang digunakan untuk meluncurkan container.
Niels Keurentjes
sejarah | grep 'buruh pelabuhan'
Adrian Mei
1
Sungguh menakjubkan Docker tidak memiliki opsi built-in untuk ini.
Macindows

Jawaban:

132

Lalu bagaimana cara reverse engineering menjalankan perintah buruh pelabuhan?

Ada repositori github yang mencoba membalikkan perintah jalankan buruh pelabuhan rekayasa, tetapi saat ini tidak sempurna, versinya 0.1.2. Anda harus mengikutinya untuk memperbarui. Mungkin suatu hari Anda bisa menggunakannya untuk mendapatkan perintah jalankan yang benar dengannya.

$ sudo pip install runlike

# run the ubuntu image
$ docker run -ti ubuntu bash

$ docker ps -a  
# suppose you get the container ID 1dfff2ba0226

# Run runlike to get the docker run command. 
$ runlike 1dfff2ba0226
docker run --name=elated_cray -t ubuntu bash

Repositori Github: runlike

Pembaruan :

Jalankan tanpa menginstal (Terima kasih @tilo)

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    assaflavie/runlike YOUR-CONTAINER

atau setel alias

alias runlike="docker run --rm -v/var/run/docker.sock:/var/run/docker.sock 
 assaflavie/runlike"

runlike YOUR-CONTAINER
BMW
sumber
1
Agak sulit untuk mengatur runlike di Synology DSM, tapi saya akan mencobanya. Terima kasih!
Jack Yu
1
Saya harus menggunakan sudo pip install runlike
Simon
@JackYu yang Anda capai untuk menginstalnya di Sysnology?
xedo
runlike menghemat banyak waktu kita => ❤️
mtt2p
21
berjalan seperti:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo
30

Gunakan buruh pelabuhan memeriksa :

$ docker inspect foo/bar
[
    {
        # …
        "Config": {
            # …
            "Cmd": [
                "/usr/local/bin/script.sh"
            ],
            # …
        }
    }
]

Anda secara terprogram dapat mengurai ini dengan jq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh
Chris Lamb
sumber
ya saya lebih suka jq juga, sedikit tweak pada perintah (sedikit lebih mudah untuk mengetik dan membaca IMHO) adalah: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll
1
"Cmd": null,Mungkin ini hanya berfungsi jika kontainer tidak dimulai secara otomatis menjadi daemon buruh pelabuhan?
Michael
23

Saya menulis alat CLI berbasis Node sederhana untuk menghasilkan docker runperintah dari wadah yang ada.

https://www.npmjs.com/package/rekcod

Berikut contohnya:

$ npm i -g rekcod
$ rekcod redis_container

docker run -d --name redis_container --restart always -h a44159e148e1 \
--expose 6379/tcp -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
-e REDIS_VERSION=3.0.7 -e REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.7.tar.gz \
-e REDIS_DOWNLOAD_SHA1=e56b4b7e033ae8dbf311f9191cf6fdf3ae974d1c \
--entrypoint "/entrypoint.sh" redis "redis-server"

Juga menangani tautan dan volume yang dipasang dan hal-hal lainnya.

Tidak super kuat saat ini, tetapi menangani lebih dari beberapa hal lain yang disebutkan, dan itu lebih dari apa yang saya cari.

EDIT: Dalam satu perintah, tanpa menginstal perangkat lunak apa pun:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nexdrew/rekcod redis_container
superEb
sumber
6

Alternatif yang lebih sederhana (?) Adalah dengan menjalankan template inspeksi buruh pelabuhan ini , yang menggunakan kapabilitas pembuatan template Go bawaan untuk mengeluarkan docker runperintah yang kompatibel. Template hanya mencakup opsi baris perintah yang paling umum, tetapi dapat dengan mudah diperpanjang.

Solusi ini tidak memiliki ketergantungan pada alat lain, kecuali buruh pelabuhan itu sendiri.

Emmanuel Frécon
sumber
5

Gunakan perintah berikut untuk mendapatkan argumen untuk semua container docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)

Abhishek Jain
sumber
1
Ini mencantumkan perintah dan argumen untuk apa yang berjalan di dalam wadah, bukan bagaimana wadah itu dimulai (yaitu jawaban atas pertanyaan yang Anda kirimkan jawaban runlike 4 menit setelah ini! :)).
OzgurH
4

Saat ini tampaknya kita harus 'memeriksa buruh pelabuhan' dan kemudian secara manual membuat ulang perintah run.

Saya menemukan seseorang mencoba menulis skrip bash untuk melakukan ini: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

tetapi tidak lengkap dan bergantung pada jq.

Rene Wooller
sumber
3

Apa yang bisa menjadi opsi yang lebih sederhana (kuat) akan menggunakan sesuatu seperti bash-preexec untuk menangkap perintah yang dimulai dengan "docker run". Anda kemudian dapat menyimpan perintah ini di suatu tempat dan mengambilnya nanti.

Misalnya, Anda dapat menambahkan sesuatu seperti ini di profil bash Anda:

[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
docker_run_history=~/.docker_run_history
docker_clear_history(){
    echo -n > $docker_run_history
}
docker_search_history(){
    search_for="$@"
    [[ -z $search_for ]] && search_for=".*"
    \cat $docker_run_history | grep "$search_for" | tail -1
}
docker_ps_mod(){
    for c in $(docker ps --format "{{.Image}}"); do 
        echo "Container $c was run using:"
        echo -e "\t$(docker_search_history $c)"
    done
}
docker_hook(){
    if [[ $@ =~ ^"docker run".*$ ]]; then
        \echo "$@" >> $docker_run_history 
    fi
}
preexec(){ 
    docker_hook $@
}

Kemudian Anda bisa menjalankan barang-barang Anda:

source ~/.bash_profile
docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
docker run -d daemon
docker_ps_mod

Output mana:

Container image was run using:
    docker run -it --rm -v $(pwd)/data:/data -p 8080:80 image
Container daemon was run using:
    docker run -d daemon
cglacet.dll
sumber
Alternatif yang menarik. +1
VonC
Tidak masuk akal bahwa buruh pelabuhan tidak merekam riwayat perintah dan hanya memiliki perpipaan seperti ini.
Macindows
3

Jika Anda tidak ingin menginstal apa pun ke dalam pengaturan server Docker yang sedang berjalan, Anda dapat menjalankannya (ganti $CONTAINER_NAMEdengan nama container yang Anda inginkan untuk argumen run):

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache nodejs nodejs-npm && npm i -g rekcod && rekcod $CONTAINER_NAME"

(untuk rekcodmetode )

atau

docker run -it--rm --volume /var/run/docker.sock:/var/run/docker.sock --privileged docker sh -c "apk add --no-cache py-pip && pip install runlike && runlike $CONTAINER_NAME"

(untuk runlikemetode )

Anthony O.
sumber
2

Perintah jalankan buruh pelabuhan itu tidak ditentukan di Dockerfile atau dokumen terkait buruh pelabuhan lainnya.

Entah Anda menemukan contoh dalam dokumentasi yang terkait dengan penampung Anda, atau Anda dapat menyimpulkan bahwa pekerja galangan berjalan dengan (setidaknya untuk perintah dan pemetaan port) a docker ps -a(tetapi itu tidak akan memberi Anda kemungkinan--volumes-from opsi yang )

Periksa juga /usr/syno/etc/packages/Docker-GitLab/config

Ini berbeda dari konfigurasi gitlab itu sendiri, yang di Synology tersedia di/usr/syno/etc/packages/Docker/synology_gitlab.config

VonC
sumber
Terima kasih telah menyebutkan lokasi file konfigurasi Synology Docker. Tetapi konfigurasi tidak dapat membantu lebih banyak lagi. Isinya hampir sama dengan Anda mengekspor penampung dari UI Web.
Jack Yu
0

Untuk membalikkan perintah jalankan buruh pelabuhan ada juga paket npm berikut.

https://github.com/nexdrew/rekcod

finrod
sumber
Haha .. buruh pelabuhan terbalik ==> rekcod
Macindows
0

Semua file buruh pelabuhan ada di sini Anda dapat menemukan cmd dan mount misalnya ls -la /proc/1 hanya cat saja

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
pengguna2319883
sumber