Docker container容器内访问宿主机host服务

问题:docker的container内,本身是一个微小的主机,那么请求127.0.0.1或者localhost,自然是请求到了container本身的网络,而无法抵达宿主机。

在以往,需要各位去手动寻找docker创建的docker0 bridge来访问宿主机网络,但在今天,docker已经提供了非常优雅的解决办法了

Linux:

Docker版本高于v20.10(2020年12月4日更新)

在启动docker时,加入如下语句
--add-host=host.docker.internal:host-gateway
而在container内,可以直接请求host.docker.internal:PORT,来获取宿主机上提供的各种服务

如果使用了Docker Compose,则应该将下面的句子加入container的声明中:

extra_hosts:
- "host.docker.internal:host-gateway"

Mac和Windows:

Docker版本高于v18.03(2018年3月21日更新)

直接在container内使用host.docker.internal:PORT来访问宿主机服务即可

对于Mac上Docker版本低于上述版本的:

Mac Docker版本v17.12到v18.02: 使用docker.for.mac.host.internal

Mac Docker版本v17.06到v18.11: 使用docker.for.mac.localhost

对于更低版本的docker,只能使用老旧的方法了,这里不再多做赘述

参考:https://stackoverflow.com/a/43541732

SwiftUI 遇到Simultaneous accesses to XXX, but modification requires exclusive access的解决办法

本质上这个问题是一个系统bug,swiftUI中,如果你的List下不完全是依靠Foreach加载的core data的数据的话(即,你在list中添加了其他的View,例如自己写了个自定义的Title等),而你又提供了删除或者移动row的方法时,就会出现这种错误。

这是由于swiftUI Foreach的onDelete的方法没有兼容上面所述的情况造成的

目前可以使用的的解决办法是这样的:
viewContext.perform {
            offsets.map { molts[$0] }.forEach(viewContext.delete)

            do {
                try viewContext.save()
            } catch {
                viewContext.rollback()
                userMessage = "\(error): \(error.localizedDescription)"
                displayMessage.toggle()
            }
}
在你的操作方法外,再套一层,调用viewContext.perform即可

使用SSH来连接远程服务器的MySQL

本文要解决什么问题:当远程服务器无法开放MySQL端口或者无权限操作远程服务器的安全组时,我们应该如何在本地连接到远程的MySQL并进行操作

本文基础要求:远程服务器至少开放了SSH端口(通常默认情况下端口号为22),如果未开放22端口,则本文所述方法并不可用。

本文方法总结:利用SSH自带的端口映射功能,建立一个tunnel,将远程服务器上的MySQL端口映射到本地的端口上,从而使得本地客户端可以直接连接

关于如何使用SSH,以及如何更简单的使用SSH,可以参考另一篇文章

当SSH已经准备就绪,打开Terminal,输入如下指令


ssh -L [local port]:[database host]:[remote port] [username]@[remote host]

ssh -L [本地端口]:[数据库所在地址]:[数据库远程端口] [远程服务器用户名]@[远程服务器地址]

*如果你不用同时登陆远程服务器进行操作,可以加上-N指令

以上指令唯一需要解释的就是数据库所在地址,如果远程服务器本身就是MySQL服务器,那么可以直接填127.0.0.1, 而如果远程服务器本身还是一个跳板,则应该输入在远程服务器内可以访问到MySQL的地址。

示例如下:

ssh -N -L 3310:127.0.0.1:3306 root@MyRemote

以上的命令会将远程服务器监听3306端口的MySQL服务,映射到本地的3310端口上,之后可以直接使用MySQL客户端在命令行里登录,或者使用pma等数据库操作工具

mysql -u root -h 127.0.0.1 -P 3310 -p

SwiftUI CoreData entity/实体更新导致无法预览的问题

最近改动了某个entity的类型,取消了它的继承,preview突然就停止工作了,一直提示crash,直接调用以下方法,清除之前的preview设定即可,因为preview里还保存了旧的设定,与新设定冲突,导致preview crash

xcrun simctl --set previews delete all

如何在SwiftUI中给字体加粗

swiftUI的文本设置,给了非常简单易懂的字体选择器,而如果想给字体加粗,该如何实现呢

这里就可以这样设置

TextField("Name", text: $name)
.font(Font.headline.weight(.light))

而可以选择的字体大小的,有如下的从小到大的名称

.caption
.footnote
.subheadline
.callout
.body
.headline
.title
.largeTitle

而字体粗细的选择,则有如下从细到粗的字段可选

.ultralight
.thin
.light
.regular
.medium
.semibold
.bold
.heavy
.black