วิธีแสดงคำสั่ง run ของ Docker container


114

ฉันใช้ GUI ของบุคคลที่สาม (แพ็คเกจ Synology Docker) เพื่อตั้งค่าคอนเทนเนอร์นักเทียบท่า อย่างไรก็ตามข้อ จำกัด ทำให้ฉันต้องเรียกใช้คอนเทนเนอร์จากบรรทัดคำสั่ง (ฉันต้องการแมป ip โฮสต์อื่นเพื่อผูกพอร์ต)

ตอนนี้เนื่องจากมีการตั้งค่ามากมายที่ทำไปแล้วฉันต้องการดึงคำสั่ง run ดั้งเดิมที่เริ่มต้นคอนเทนเนอร์นี้จากนั้นฉันสามารถเปลี่ยนพอร์ตการแมปพอร์ตเป็นพอร์ตใหม่ได้ เช่น. " docker run -p 80:8080 gitlab"

ฉันหาวิธีทำไม่ได้ใช้เหตุการณ์ "นักเทียบท่าตรวจสอบ" ไม่มีข้อมูลดังกล่าวให้

โปรดให้คำแนะนำเพื่อแก้ปัญหานี้



7
@capitalistpug คำถามนั้นตรงข้ามกับคำถามนี้ - มันเกี่ยวกับคำสั่งภายในคอนเทนเนอร์ซึ่งเป็นคำถามเกี่ยวกับคำสั่งที่ใช้เปิดคอนเทนเนอร์
Niels Keurentjes

ประวัติศาสตร์ | grep 'docker run'
เอเดรียน

1
เป็นที่น่าอัศจรรย์ Docker ไม่มีตัวเลือกในตัวสำหรับสิ่งนี้
Macindows

คำตอบ:


143

ดังนั้นวิธีการรันคำสั่งวิศวกรรมนักเทียบท่าวิศวกรรมย้อนกลับ

มีที่เก็บ github ซึ่งพยายามย้อนวิศวกรรมคำสั่งรันนักเทียบท่า แต่ตอนนี้ยังไม่สมบูรณ์แบบคือเวอร์ชัน0.1.2. คุณควรติดตามเพื่ออัปเดต บางทีวันหนึ่งคุณสามารถใช้เพื่อรับคำสั่งรันที่ถูกต้องได้

$ 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

ที่เก็บ Github: runlike

อัพเดท:

เรียกใช้โดยไม่ต้องติดตั้ง (ขอบคุณ @tilo)

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

หรือตั้งนามแฝง

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

runlike YOUR-CONTAINER

1
การตั้งค่าที่เหมือนกันบน Synology DSM นั้นยากเล็กน้อย แต่ฉันจะลองดู ขอบคุณ!
Jack Yu

1
ฉันต้องใช้ sudo pip install runlike
Simon

@JackYu คุณประสบความสำเร็จในการติดตั้งใน Sysnology หรือไม่?
xedo

runlike ช่วยเราประหยัดเวลาได้มาก => ❤️
mtt2p

21
run like:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo

36

ใช้นักเทียบท่าตรวจสอบ :

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

คุณสามารถแยกวิเคราะห์ทางโปรแกรมด้วยjq :

$ docker inspect foo/bar | jq -r '.[0]["Config"]["Cmd"][0]'
/usr/local/bin/script.sh

1
ใช่ฉันชอบ jq ด้วยเช่นกันการปรับแต่งคำสั่งเล็กน้อย (ง่ายกว่าเล็กน้อยในการพิมพ์และอ่าน IMHO) คือ: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll

1
"Cmd": null,อาจจะใช้ได้เฉพาะในกรณีที่คอนเทนเนอร์ไม่ได้เริ่มโดยอัตโนมัติเป็น Docker daemon?
Michael

28

ฉันเขียนเครื่องมือ CLI ที่ใช้โหนดอย่างง่ายเพื่อสร้างไฟล์ docker runคำสั่งจากคอนเทนเนอร์ที่มีอยู่

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

นี่คือตัวอย่าง:

$ 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"

จัดการลิงค์และไดรฟ์ข้อมูลที่เมาท์และสิ่งอื่น ๆ

ตอนนี้ยังไม่แข็งแกร่งมากนัก แต่จัดการได้มากกว่าสิ่งอื่น ๆ ที่กล่าวถึงและเป็นสิ่งที่ฉันกำลังมองหามากกว่า

แก้ไข: ในคำสั่งเดียวโดยไม่ต้องติดตั้งซอฟต์แวร์ใด ๆ :

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

7

ทางเลือกที่ง่ายกว่า (?) คือการเรียกใช้เทมเพลตการตรวจสอบนักเทียบท่านี้ซึ่งใช้ความสามารถในการเทมเพลต Go ในตัวเพื่อส่งออก adocker runคำสั่งที่เข้ากันได้ เทมเพลตนี้ครอบคลุมเฉพาะตัวเลือกบรรทัดคำสั่งทั่วไป แต่สามารถขยายได้อย่างง่ายดาย

โซลูชันนี้ไม่มีการพึ่งพาเครื่องมืออื่น ๆ ยกเว้นนักเทียบท่าเอง


5

ใช้คำสั่งต่อไปนี้เพื่อรับอาร์กิวเมนต์สำหรับคอนเทนเนอร์ทั้งหมด docker ตรวจสอบ -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
นี่จะแสดงรายการคำสั่งและอาร์กิวเมนต์สำหรับสิ่งที่กำลังทำงานอยู่ภายในคอนเทนเนอร์ไม่ใช่วิธีที่คอนเทนเนอร์เริ่มต้น (เช่นคำตอบสำหรับคำถามที่คุณโพสต์คำตอบแบบรันไลค์ 4 นาทีหลังจากนี้! :))
OzgurH

4

ขณะนี้ดูเหมือนว่าเราต้องไปที่ 'นักเทียบท่าตรวจสอบ' แล้วสร้างคำสั่งเรียกใช้ด้วยตนเอง

ฉันพบว่ามีคนพยายามเขียน bash script เพื่อทำสิ่งนี้: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

แต่มันไม่สมบูรณ์และขึ้นอยู่กับ jq


4

หากคุณไม่ต้องการติดตั้งสิ่งใดในการตั้งค่าเซิร์ฟเวอร์ Docker ที่กำลังรันอยู่คุณสามารถดำเนินการ (แทนที่$CONTAINER_NAMEด้วยชื่อคอนเทนเนอร์ที่คุณต้องการให้มีอาร์กิวเมนต์รัน):

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"

(สำหรับrekcodวิธีการ )

หรือ

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"

(สำหรับrunlike วิธีการ )


ฉันคิดว่าควรมีช่องว่างระหว่าง-itและ--rm
IpsRich

@IpsRich คุณถูกต้องฉันแก้ไขคำตอบแล้วขอบคุณ!
Anthony O.

3

สิ่งที่อาจเป็นตัวเลือกที่ง่ายกว่า (แข็งแกร่ง) คือการใช้บางอย่างเช่นbash-preexecเพื่อจับคำสั่งที่ขึ้นต้นด้วย "นักเทียบท่าวิ่ง" จากนั้นคุณสามารถจัดเก็บคำสั่งเหล่านี้ไว้ที่ใดที่หนึ่งและเรียกดูในภายหลัง

ตัวอย่างเช่นคุณสามารถเพิ่มสิ่งนี้ในโปรไฟล์ทุบตีของคุณ:

[[ -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 $@
}

จากนั้นคุณสามารถเรียกใช้สิ่งต่างๆของคุณ:

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

ผลลัพธ์ใด:

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

ทางเลือกที่น่าสนใจ +1
VonC

เป็นเรื่องไร้สาระที่นักเทียบท่าจะไม่บันทึกประวัติคำสั่งและมีท่อแบบนี้
Macindows

2

คำสั่งเรียกใช้นักเทียบท่านั้นไม่ได้ระบุไว้ใน Dockerfile หรือเอกสารอื่น ๆ ที่เกี่ยวข้องกับนักเทียบท่า

ไม่ว่าคุณจะพบตัวอย่างในเอกสารที่เกี่ยวข้องกับคอนเทนเนอร์ของคุณหรือคุณสามารถสรุปได้ว่านักเทียบท่าทำงานด้วย (อย่างน้อยสำหรับคำสั่งและการแมปพอร์ต) a docker ps -a(แต่จะไม่ให้--volumes-fromตัวเลือกที่เป็นไปได้แก่คุณ)

ตรวจสอบด้วย /usr/syno/etc/packages/Docker-GitLab/config

สิ่งนี้แตกต่างจากการกำหนดค่าgitlab ซึ่งใน Synologyมีให้ใน/usr/syno/etc/packages/Docker/synology_gitlab.config


ขอขอบคุณที่ระบุตำแหน่งไฟล์ config ของ Synology Docker แต่ config ไม่สามารถช่วยอะไรได้มากกว่านี้ เนื้อหานี้เหมือนกับที่คุณส่งออกคอนเทนเนอร์จาก Web UI
Jack Yu


0

ไฟล์นักเทียบท่าทั้งหมดอยู่ที่นี่คุณสามารถค้นหา cmd และเมาท์ได้เช่น ls -la /proc/1 cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.