mysql - 在 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> 。相反,我得到了这种行为:
弹出窗口显示“Windows 找不到 '192.168.99.101'。请确保您输入的名称正确,然后重试。”
控制台文本:
系统找不到文件 192.168.99.101。
*
X 打开 url 失败:192.168.99.101:退出状态 1
*
* minikube 由于错误而退出。如果上述消息没有用,请打开一个问题:
- (发送错误信息的 URL)
一个弹出窗口,说明“Windows 找不到 '31067'。请确保您输入了正确的名称,然后重试。”
控制台文本:
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 不断启动,出错并重新启动。不知道怎么回事...
杰罗姆。
解决方案
我现在看到很多事情出错了。
首先,我一直认为 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> 提示符。现在我可以运行“创建数据库食谱;”。
解决了!
推荐阅读
- c# - DataGridViewTextBoxCell 在悬停时显示 false 绑定到布尔值。我该如何隐藏它?
- .net - 如何在 .Net 应用程序中使用 WEBAPI 作为服务参考?
- python - 包含文件的 jinja2 块的上下文行为
- javascript - 如何捕获 THREE.Scene uning THREE.PerspectiveCamera 的图像?
- google-cloud-dataflow - 如何使用数据流从 pubsub 源并行读取
- ios - 过于频繁地更新 UILabel 文本
- r - 提取每个主题 (R) 内另一个数据框中存在的日期
- group-by - SAS:将两个图按组合并为一个
- docker - 如何在 gitlab runner 的 docker executor 中添加 ca.crt ie 证书?
- javascript - 如何在reactjs中从同一父组件获取不同布局的帖子