Cách hiển thị lệnh chạy của bộ chứa docker


102

Tôi sử dụng GUI của bên thứ ba (gói Synology Docker) để thiết lập vùng chứa docker. Tuy nhiên, hạn chế của nó khiến tôi phải chạy vùng chứa từ dòng lệnh. (Tôi muốn ánh xạ một ip máy chủ khác để liên kết cổng)

Bây giờ, vì có rất nhiều cài đặt đã được thực hiện, tôi muốn truy xuất lệnh chạy ban đầu khởi động vùng chứa này, sau đó tôi có thể thay đổi cổng ánh xạ cổng thành mới. ví dụ. " docker run -p 80:8080 gitlab"

Tôi không thể tìm thấy cách để làm như vậy, sử dụng sự kiện "thanh tra docker", không có thông tin nào được cung cấp.

Xin vui lòng cung cấp một số lời khuyên để giải quyết vấn đề này.



6
@capitalistpug câu hỏi đó hoàn toàn ngược lại với câu hỏi này - đó là về lệnh bên trong vùng chứa, đây là về lệnh được sử dụng để khởi chạy vùng chứa.
Niels Keurentjes

lịch sử | grep 'docker run'
Adrian Ngày

1
Điều đáng ngạc nhiên là Docker không có tùy chọn tích hợp sẵn cho việc này.
Macindows

Câu trả lời:


132

Vậy làm thế nào để đảo ngược lệnh chạy của docker?

Có một kho lưu trữ github cố gắng đảo ngược lệnh chạy của docker kỹ thuật, nhưng hiện tại nó không phải là phiên bản hoàn hảo 0.1.2. Bạn nên theo dõi để cập nhật. Có thể một ngày nào đó bạn có thể sử dụng nó để có được lệnh chạy chính xác với nó.

$ 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

Kho lưu trữ Github: runlike

Cập nhật :

Chạy mà không cần cài đặt (Cảm ơn @tilo)

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

hoặc đặt bí danh

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

runlike YOUR-CONTAINER

1
Hơi khó để thiết lập runlike trên Synology DSM, nhưng tôi sẽ thử. Cảm ơn bạn!
Jack Yu

1
Tôi đã phải sử dụng sudo pip install runlike
Simon

@JackYu bạn đã đạt được để cài đặt nó trong Sysnology chưa?
xedo

runlike giúp chúng tôi tiết kiệm rất nhiều thời gian => ❤️
mtt2p

21
chạy như:docker run -v /var/run/docker.sock:/var/run/docker.sock \ assaflavie/runlike YOUR-CONTAINER
Tilo

30

Sử dụng thanh tra docker :

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

Bạn có thể phân tích cú pháp theo chương trình này với jq :

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

vâng tôi thích JQ quá, một tinh chỉnh nhẹ trên lệnh (một chút dễ dàng hơn để gõ và đọc IMHO) là: docker inspect <CONTAINER> | jq ".[0].Config.Cmd"
Paul Carroll

1
"Cmd": null,Có lẽ điều này chỉ hoạt động nếu vùng chứa không được khởi động tự động là trình nền của docker?
Michael

23

Tôi đã viết một công cụ CLI dựa trên Node đơn giản để tạo một docker runlệnh từ một vùng chứa hiện có.

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

Đây là một ví dụ:

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

Đồng thời xử lý các liên kết và khối lượng được gắn kết và những thứ khác.

Không phải là siêu mạnh vào lúc này, nhưng xử lý nhiều hơn một số thứ khác được đề cập và đó là nhiều thứ tôi đang tìm kiếm.

CHỈNH SỬA: Trong một lệnh duy nhất, không cần cài đặt bất kỳ phần mềm nào:

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

6

Một giải pháp thay thế đơn giản hơn (?) Là chạy mẫu kiểm tra trình cố định này , mẫu này sử dụng các khả năng tạo khuôn mẫu của nội dung Go để xuất radocker run lệnh tương thích. Mẫu chỉ bao gồm các tùy chọn dòng lệnh thông thường nhất, nhưng nó có thể dễ dàng mở rộng.

Giải pháp này không phụ thuộc vào các công cụ khác, ngoại trừ chính docker.


5

Sử dụng lệnh sau để lấy các đối số cho tất cả các bộ chứa docker Kiểm tra -f "{{.Name}} {{.Path}} {{.Args}}" $ (docker ps -a -q)


1
Điều này liệt kê lệnh và đối số cho những gì đang chạy bên trong vùng chứa, không phải cách vùng chứa được bắt đầu (tức là câu trả lời cho câu hỏi bạn đã đăng câu trả lời runlike 4 phút sau đó! :)).
OzgurH

4

Hiện tại, có vẻ như chúng ta phải 'kiểm tra docker' và sau đó tạo lại lệnh chạy theo cách thủ công.

Tôi đã tìm thấy ai đó đang cố gắng viết một tập lệnh bash để thực hiện việc này: https://gist.github.com/miracle2k/c85b7b077fdb8d54bc89

nhưng nó không đầy đủ và phụ thuộc vào jq.


3

Điều gì có thể là một tùy chọn đơn giản hơn (mạnh mẽ) sẽ là sử dụng một cái gì đó như bash-preexec để nắm bắt các lệnh bắt đầu bằng "docker run". Sau đó, bạn có thể lưu trữ các lệnh này ở đâu đó và truy xuất chúng sau.

Ví dụ: bạn có thể thêm một cái gì đó như thế này vào hồ sơ bash của mình:

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

Sau đó, bạn chỉ có thể chạy những thứ của mình:

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

Kết quả đầu ra:

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

Thay thế thú vị. +1
VonC

Thật vô lý khi docker không ghi lại lịch sử lệnh và có một đường ống đơn giản như thế này.
Macindows

3

Nếu bạn không muốn cài đặt bất kỳ thứ gì vào thiết lập máy chủ Docker đang chạy hiện tại của mình, bạn có thể chỉ cần thực thi (thay thế $CONTAINER_NAMEbằng tên vùng chứa mà bạn muốn có các đối số chạy):

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"

(đối với rekcodphương pháp )

hoặc là

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"

(đối với runlikephương pháp )


2

Lệnh chạy docker đó không được chỉ định trong Dockerfile hoặc bất kỳ tài liệu nào khác liên quan đến docker.

Hoặc bạn tìm thấy một ví dụ trong tài liệu được liên kết với vùng chứa của mình hoặc bạn có thể suy ra rằng docker chạy với (ít nhất là đối với lệnh và ánh xạ cổng) a docker ps -a(nhưng điều đó sẽ không cung cấp cho bạn điều có thể--volumes-from tùy chọn )

Kiểm tra cũng /usr/syno/etc/packages/Docker-GitLab/config

Điều này khác với cấu hình gitlab mà trên Synology có sẵn trong/usr/syno/etc/packages/Docker/synology_gitlab.config


Cảm ơn bạn đã đề cập đến vị trí tệp cấu hình của Synology Docker. Nhưng cấu hình không thể giúp được nhiều hơn. Nội dung của nó giống như bạn xuất vùng chứa từ giao diện người dùng Web.
Jack Yu


0

Tất cả các tệp docker đều có ở đây, bạn có thể tìm cmd và mount, chẳng hạn như ls -la /proc/1 cat it

cat /proc/1/cmdline
nginx: master process nginx -g daemon off;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.