使用 Docker + Kitura,但不在 Mac 上

Posted

技术标签:

【中文标题】使用 Docker + Kitura,但不在 Mac 上【英文标题】:Use Docker + Kitura, but not on a Mac 【发布时间】:2017-11-30 20:43:04 【问题描述】:

我在 Mac 上有一个完美的 Swift-Docker-Kitura 项目...

使用 Xcode 处理代码,然后在终端中 docker build。它建立。您docker run 甚至可以在本地主机上查看网页。然后,您可以docker push,它转到主 AWS 云并进行托管。

这一切都很好。

但如果我想“不在 Mac 上”使用 Swift-Docker-Kitura 怎么办?

您能否在 AWS(或类似服务)上的某种 shell 上“构建”和“推动”这样一个快速的项目?

【问题讨论】:

【参考方案1】:

有多种选项可用于构建和运行 Kitura Web 应用程序,但并非所有选项都得到官方支持。

    在 Mac 上从 Xcode 项目运行它,在 Xcode 中构建。 在 Mac 上的命令行中运行它,使用 swift build 构建。 在 Ubuntu 的命令行中运行它,使用 swift build 构建。 在支持 Cloud Foundry 构建包的云上运行它。见https://github.com/IBM-Swift/swift-buildpack。例如,在 IBM Bluemix 上,请参阅 https://console.bluemix.net/catalog/starters/runtime-for-swift。 在支持 docker 的任何平台上的 Ubuntu docker 中运行它,请参阅 http://www.kitura.io/en/starter/leveragedocker.html。 使用 Kitura 应用程序代码(参见 https://github.com/IBM-Swift/swift-ubuntu-docker#using-ibmcomswift-ubuntu-runtime)创建一个 docker 镜像,并将其推送到任何支持执行 docker 镜像的云。例如,IBM Bluemix Kubernetes Cluster https://console.bluemix.net/containers-kubernetes/catalogCluster。 您甚至可以将其嵌入到 ios 应用程序中,请参阅 https://developer.ibm.com/swift/2017/03/13/kitura-ios/。 您可以在大型机上运行它,请参阅https://developer.ibm.com/swift/2017/10/05/swift-zos-swift-4-0-beta-update/。

从 iPhone 到大型机,在 Mac、Ubuntu、Docker 和各种云提供商上,这些都是运行 Kitura 的选项。

免责声明:我在 IBM 工作。截至本次编辑之日(2017 年 12 月 28 日),据我所知,IBM 仅在此处描述的环境中支持 Kitura https://developer.ibm.com/swift/2017/10/30/commercial-support/。

【讨论】:

嘿 Vadim,新年快乐,非常感谢您的回答。这肯定比我有更多的信息。我仍然很难理解“我到底要如何在 AWS 上运行?(或其他什么??)”......我只是无法真正“开始”:/ 这个链接也在极大地扩展我的知识的同时似乎离开了基础知识,我不知道...... :O 再次感谢 嘿@Fattie,新年快乐!我已经编辑并扩展了我的答案。希望现在更清楚了。【参考方案2】:

您的选择有限。首先,Swift 目前仅在 Ubuntu 上获得认证。因此,您要在其上开发的主机必须运行 Ubuntu,或者必须运行 Docker,您可以在该主机上运行 Ubuntu。

理论上你也可以在你的目标主机上快速编译。我曾经为 Debain (Jessie) 为旧版本的 Swift 做过这个,虽然我设法编译了它,但它肯定不稳定。从那以后情况可能有所改善,我还没有检查过。

所以最简单的方法就是依赖 Docker。这也允许您通过在 Xcode 中进行编辑,然后在命令行上手动编译它,从而在您的 Mac 上进行开发。

我使用以下 bash 函数打开我的 Linux 环境:

SwiftDocker2 ()

    name=`perl -e 'open IN, "</usr/share/dict/words";rand($.) \
        < 1 && ($n=$_) while <IN>;print $n'`;
    docker run -i -t --name=$name -h $name --log-driver=json-file \
        -w /project -v $(pwd):/project -p 9000:9000 ibmcom/swift-ubuntu /bin/bash;
    echo "Created image $name";
    echo "Stopping image";
    docker stop $name;
    echo "Removing image";
    docker rm $name

在上面的示例中,我打开了您的应用程序可能不需要的端口 9000。

我想说的最后一点是构建目录的使用。我使用 Makefile 进行构建,在 Makefile 中我有以下部分:

BUILD_LINUX = "./.build-linux"
BUILD_MACOS = "./.build-macos"
UNAME = $(shell uname)

ifeq ($UNAME, Darwin)
BUILD_PATH = $BUILD_MACOS
else
BUILD_PATH = $BUILD_LINUX
endif

xcode:
    @swift package --build-path $BUILD_PATH -Xlinker -L/usr/local/lib generate-xcodeproj

build:
    rm -f Package.pins
    swift build --build-path $BUILD_PATH -Xlinker "-L/usr/local/lib"

通过使用这种结构,MacOS 环境将使用目录 .build-macos 进行构建,而 Linux 将使用文件 .build-Linux。文件Package.pins 在构建过程中被删除,以确保一些关于要使用的版本的内存不会在两个环境之间传输。

【讨论】:

嘿,弗雷德,新年快乐,感谢一百万。我不完全理解你的意思:假设我有一个 AWS 账户并且我创建了一个 (??) Ubuntu Thing。你的第一个代码片段是我会在那个 shell 上运行的,还是你的意思是在我的 Mac 上本地运行?正在努力解决这个问题,谢谢! 顺便说一句,当时间限制到来时,我会发送另一个赏金:) 谢谢... 我不明白您使用的是 AWS,我认为这无关紧要;即你有一个部署的 Docker 环境。我自己在 Mac 上运行,并使用该功能临时切换到我的 Mac 上托管的 Docker 环境。正如您所指出的,您已经知道如何推送到 Docker,所以请忽略我回答的这一部分。因此,如果您登录到要运行开发的 Ubuntu 主机,您可以运行以下命令: swift build 该命令足以构建您的源代码。 它将期望找到一个 Package.swift 文件来指导您的编译。另请参阅 fred.appelman.net/?p=113> 上面的 Makefile 片段是我用来构建的等等。例如而不是运行 swift build 我将运行 make build 这使得构建在 .build-linux 而不是标准的 .build 目录中完成。

以上是关于使用 Docker + Kitura,但不在 Mac 上的主要内容,如果未能解决你的问题,请参考以下文章

在 Kitura 中使用 Microsoft SQL Server

Post 在 Kitura 中将 Request Body 设为 nil

如何找到 Kitura 服务器的资源文件?

如何在 Kitura 中测试 CORS?

Swift Package Manager 无法解析 1.4 以上的 Kitura 版本

如何在kitura应用程序中调用mysql存储过程