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.



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

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

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

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.


5

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


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


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

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 )


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


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

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.