使用
gcloud compute instances create-with-container
时,如果我使用具有 bash
作为 CMD 或 ENTRYPOINT 的映像,并且如果我通过 ssh 进入虚拟机,并最终附加到容器,那么我最终会按预期进入 bash
shell:
> gcloud compute instances create-with-container test \
--container-image debian:12-slim --container-stdin --container-tty
> gcloud compute ssh test
########################[ Welcome ]########################
# You have logged in to the guest OS. #
# To access your containers use 'docker attach' command #
###########################################################
come@test ~ $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2667f985b3f1 debian:12-slim "bash" 2 hours ago Up About an hour klt-test-wwbe
come@test ~ $ docker inspect klt-test-wwbe | grep -A 1 Cmd
"Cmd": [
"bash"
come@test ~ $ docker attach klt-test-wwbe
root@test:/# echo $SHELL
/bin/bash
root@test:/#
使用
--command
选项附加容器时获得相同的效果:
> gcloud compute ssh test --command "docker attach klt-test-wwbe" -- -t
root@test:/# echo $SHELL
/bin/bash
但是,如果我使用
gcloud
ssh 进入容器并使用 --container
选项连接到容器,我最终不会进入 bash
shell:
> gcloud compute ssh test --container klt-test-wwbe
# echo $SHELL
#
为什么会这样呢?以及如何在使用
gcloud compute ssh test --container klt-test-wwbe
时获得指定为 docker 映像的 ENTRYPOINT 或 CMD 的 shell(或其他环境),最好无需键入它。
当然,在这个例子中,我只需输入
bash
即可完成。但如果 ENTRYPOINT 或 CMD 不是那么微不足道的东西,我首先需要检查容器,这在某种程度上会达不到目的。
gcloud compute ssh
使用 ssh
,您可以使用 -vvv
获取更详细的日志记录以查看发生了什么:
gcloud compute ssh ${NAME} \
--container=${CONTAINER} \
--zone=${ZONE} \
--project=${PROJECT} \
--ssh-flag="-vvv"
如果您对输出进行 grep,您应该看到:
debug1: Sending command: sudo docker exec -it {CONTAINER} /bin/sh
注意它正在使用
不是sh
bash
这应该反映以下行为:
cloud compute ssh ${NAME} \
--zone=${ZONE} \
--project=${PROJECT} \
--command="docker exec -it {CONTAINER} /bin/sh"