在 Centos7.2 上安装编译 Swift

cubegao 2018-03-30 PM 751℃ 0条

由于想用Swift写服务玩玩,准备在Centos7.2上部署一个Swift环境,能跑一下Perfect。

由于Docker的种种好处,当然是选择它来部署Swift环境。

安装Docker

更新yum包到最新。如果是生产机器务必慎重更新内核,避免出现不必要的问题。

[root@fadaixiaohai ~]# yum update

执行 Docker 安装脚本。

[root@fadaixiaohai ~]# curl -fsSL https://get.docker.com/ | sh

启动 Docker 进程。

[root@fadaixiaohai ~]# service docker start

验证 docker 是否安装成功并在容器中执行一个测试的镜像。

[root@fadaixiaohai ~]# docker run hello-world
Hello from Docker!

大概两三分钟就安装好了,国内的服务器可能要用镜像加速会好点。

安装Swift

拉取Swift的镜像到本地。

[root@fadaixiaohai ~]# docker pull swift

镜像拉取成功后就可以使用docker images列出当前我们拉取到本地的所有镜像:

[root@fadaixiaohai ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
swift               latest              934835f58041        3 weeks ago         1.3GB
hello-world         latest              f2a91732366c        4 months ago        1.85kB

我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

在镜像里面创建一个容器并且连接它

[root@fadaixiaohai ~]# docker run  -it --name swiftfun swift /bin/bash

其中-it意思是以交互式(interactive)终端(tty)的方式运行,--name swiftfun指定容器的名称,/bin/bash是容器启动后执行的命令,也就是进入bash控制台,运行成功后会进入:

root@8408a26c123b:/#

默认是root用户,这里我们使用诸如apt-get命令时就不需要加sudo了

现在,你可以在容器中运行swift --version来确认是否配置成功:

root@8408a26c123b:/# swift --version
Swift version 4.0.3 (swift-4.0.3-RELEASE)
Target: x86_64-unknown-linux-gnu

然后用swift命令看是否能进入swift REPL:

root@8408a26c123b:/# swift
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8

发现报错了,找到Docker官方给的解决方案是:

[root@fadaixiaohai ~]# docker run --cap-add sys_ptrace -it --rm swift swift
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8

运行时添加了--cap-add sys_ptrace选项,应该是添加一个系统的权限。加上--rm选项是创建新容器时,把已经存在的旧容器删掉。但是依然是相同的报错。

最后在github上面好到了解决方案。添加一条--privileged。它的含义是:
--privileged=false Give extended privileges to this container 赋予容器扩展权限
运行结果如下:

[root@fadaixiaohai ~]# docker run --cap-add sys_ptrace --privileged -it --rm swift swift
Welcome to Swift version 4.0.3 (swift-4.0.3-RELEASE). Type :help for assistance.
1> print("hello world")
hello world
2>

以后想要连接swiftfun这个容器,必须先启动,后连接。方法如下:

[root@fadaixiaohai ~]# docker start swiftfun
swiftfun
[root@fadaixiaohai ~]# docker attach swiftfun
root@8408a26c123b:/#

查看所有容器状态:

[root@fadaixiaohai ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
8408a26c123b        swift               "/bin/bash"         27 hours ago        Exited (0) About a minute ago                       swiftfun
cc12559d586c        hello-world         "/hello"            27 hours ago        Exited (0) 27 hours ago                             boring_yonath

设置Docker开机启动。

[root@fadaixiaohai ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

以上就是本文的所有内容了,祝你玩得愉快!

标签: iOS开发, Siwft, iOS, Centos, Docker

非特殊说明,本博所有文章均为博主原创。

评论啦~