首页 > 解决方案 > 在 Windows 10 上使用 bash,为什么它会将我的 $() 作为单独的命令执行?

问题描述

我正在学习如何在 Windows 10 家庭计算机上使用 Docker 和 Minikube。我已经安装好需要的软件了。我已经安装了 Docker、minikube、kubectl 和最新版本的 MySQL,路径正确,因此可以使用它的 CLI。我正在使用 GIT 提供的 Bash 控制台和/或 Cygwin 提供的 Bash 控制台。两者似乎都提供了相同的(坏的)结果。

我启动 Docker,并安装 MySQL 服务。kubectl get all 显示一切运行正常。

根据我正在阅读的编程书,我想尝试通过以下命令访问 MySQL:

mysql -h $(minikube service mysql-svc --format "{{.IP}}") -P $(minikube service mysql-svc --format "{{.Port}}") -u root -p

结果应该是 MySQL CLI 提示符,如 mysql> 。相反,我得到了这种行为:

  1. 弹出窗口显示“Windows 找不到 '192.168.99.101'。请确保您输入的名称正确,然后重试。”

  2. 控制台文本:

    系统找不到文件 192.168.99.101。

    *

    X 打开 url 失败:192.168.99.101:退出状态 1

    *

    * minikube 由于错误而退出。如果上述消息没有用,请打开一个问题:

    - (发送错误信息的 URL)

  3. 一个弹出窗口,说明“Windows 找不到 '31067'。请确保您输入了正确的名称,然后重试。”

  4. 控制台文本:

    mysql: [错误] 未知后缀 '|' 用于变量“端口”(值(给出围绕 minikube 服务 mysql-svc 的输出的边界围栏。)mysql:[错误](mysql.exe 的路径):设置值时出错 '|-----| ---(等)'到'端口'

预期的行为是将 IP 和端口插入 mysql 命令行,然后触发类似 mysql -h http://192.168.99.101 -P 31067 -u root -p 的命令。

我认为问题在于在 Windows 环境中使用 Bash 控制台。任何解释表示赞赏。

谢谢,

杰罗姆。

2020 年 8 月 7 日更新:

我被要求更彻底地记录我的问题。开始了。

以下是 Docker 所知道的:

$ docker images
REPOSITORY                                                        TAG
      IMAGE ID            CREATED             SIZE
logicaltiger/cloudnative-statelessness-posts                      latest
      3a3c66daf7f3        5 days ago          139MB
logicaltiger/cloudnative-statelessness-connections                latest
      d060e9857f49        5 days ago          139MB
logicaltiger/cloudnative-statelessness-connectionposts-stateful   latest
      ce33f0966380        5 days ago          123MB
openjdk                                                           8-jdk-alpine
      a3562aa0b991        15 months ago       105MB
mysql                                                             8.0.12
      ee1e8adfcefb        22 months ago       484MB

这是我对 minikube 的重新配置。其他海报建议 minikube 运行不稳定,除非提供大量资源。

$ minikube delete
* Deleting "minikube" in virtualbox ...
* Removed all traces of the "minikube" cluster.

$ minikube start --cpus=4 --memory=4096
* minikube v1.12.1 on Microsoft Windows 10 Home 10.0.18363 Build 18363
* Automatically selected the virtualbox driver
* Starting control plane node minikube in cluster minikube
* Creating virtualbox VM (CPUs=4, Memory=4096MB, Disk=20000MB) ...
* Found network options:
  - NO_PROXY=192.168.99.100
  - no_proxy=192.168.99.100
* Preparing Kubernetes v1.18.3 on Docker 19.03.12 ...
  - env NO_PROXY=192.168.99.100
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* Done! kubectl is now configured to use "minikube"

从它的 yaml 文件启动 mysql 后,我让它运行:

$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/mysql-7dbfd4dbc4-b2tmm   1/1     Running   0          2m55s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          A
GE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP          6
m43s
service/mysql-svc    NodePort    10.102.7.119   <none>        3306:32235/TCP   2
m55s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql   1/1     1            1           2m55s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-7dbfd4dbc4   1         1         1       2m55s

现在获取 mysql-svc URL:

$ minikube service mysql-svc --url
http://192.168.99.102:32235

尝试运行本书示例。我再次得到两个弹出窗口以及终端中显示的内容。我在这里省略了弹出窗口文本...

$ mysql -h $(minikube service mysql-svc --format "{{.IP}}") -P $(minikube service mysql-svc --format "{{.Port}}") -u root -p
The system cannot find the file 192.168.99.102.
*
X open url failed: 192.168.99.102: exit status 1
*
* minikube is exiting due to an error. If the above message is not useful, open
an issue:
  - https://github.com/kubernetes/minikube/issues/new/choose
The system cannot find the file 32235.
*
X open url failed: 32235: exit status 1
*
* minikube is exiting due to an error. If the above message is not useful, open
an issue:
  - https://github.com/kubernetes/minikube/issues/new/choose
mysql: [ERROR] Unknown suffix '|' used for variable 'port' (value '|-----------|
-----------|-------------|-------|')
mysql: [ERROR] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe: Error whil
e setting value '|-----------|-----------|-------------|-------|' to 'port'

我被问到如果我直接输入 IP 会发生什么。从上面看,那个 IP 是http://192.168.99.102:32235

$ mysql -h http://192.168.99.102 -P 32235 -u root -p
Enter password: **********
ERROR 2005 (HY000): Unknown MySQL server host 'http://192.168.99.102' (0)

直接输入 IP 和端口时,到达 MySQL 服务器请参阅“输入密码:”提示),但请求被拒绝。我在想我不知道如何让 MySQL 使用 HTTP 请求。

但是MySQL不知道如何处理IP,以及间接方法(minikube service mysql -svc ...)的方式,相关吗?

继续,我用 MySQL 地址编辑我的 cookbook-deployment-posts.yaml 文件:

kind: Service
apiVersion: v1
metadata:
  name: posts-svc
spec:
  selector:
    app: posts
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 8080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: posts
  labels:
    app: posts
spec:
  replicas: 1
  selector:
    matchLabels:
      app: posts
  template:
    metadata:
      labels:
        app: posts
    spec:
      containers:
      - name: posts
        image: cdavisafc/cloudnative-statelessness-posts
        env:
          - name: INSTANCE_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: PORT
            value: "8080"
          - name: SPRING_APPLICATION_JSON
            value: '{"spring":{"datasource":{"url":"jdbc:mysql://192.168.99.102:32235/cookbook"}}}'

去 kubectl get all,posts-svc 不断启动,出错并重新启动。不知道怎么回事...

杰罗姆。

标签: mysqlwindowsgit-bashminikube

解决方案


我现在看到很多事情出错了。

首先,我一直认为 mysql 调用与我 PC 上安装的 MySQL 有关。从来都不是。仅仅因为我在我的 PC 实例上手动创建了一个食谱数据库并不意味着通过 Docker / Minikube 的教科书示例曾经引用它。

其次,教科书在其 minikube 请求中缺少 --url。这是正在发生的事情。

> kubectl create -f mysql-deployment.yaml

> minikube service mysql-svc --url
http://192.168.99.102:31030

> minikube service mysql-svc

这将打开 Web 浏览器以显示位于 192.168.99.102:31030 的服务。 mysql 服务不呈现网页,但这与本示例无关。 然后控制台在 ASCII 框中显示服务的详细信息(命名空间、名称、目标端口、url)。

minikube service mysql-svc --format "{{.IP}}"

这想打开 Web 浏览器以在http://192.168.99.102显示服务,隐含端口为 80。但是那里什么都没有,并且 Windows 在弹出框处抱怨。然后控制台抱怨没有打开该网址。

minikube service mysql-svc --format "{{.Port}}"

这要打开 Web 浏览器以显示 31030 处的服务,这不是有效的 URL。投诉,投诉。

我一直想要的是将 --url 添加到 minikube 位:

mysql -h $(minikube service mysql-svc --format "{{.IP}}" --url) -P $(minikube service mysql-svc --format "{{.Port}}" --url) -u root -p

这将连接到控制台中的托管 mysql,产生 mysql> 提示符。现在我可以运行“创建数据库食谱;”。

解决了!


推荐阅读