3.3. 使用 CLI 创建应用程序
您可以使用 OpenShift Container Platform CLI,从包含源代码或二进制代码、镜像和模板的组件创建 OpenShift Container Platform 应用程序。
由 new-app
创建的对象集合取决于作为输入传递的工件,如输入源存储库、镜像或模板。
3.3.1. 从源代码创建应用程序
您可以使用 new-app
命令,从本地或远程 Git 存储库中的源代码创建应用程序。
new-app
命令会创建一个构建配置,其本身会从您的源代码中创建一个新的应用程序镜像。new-app
命令通常还会创建一个 Deployment
对象来部署新镜像,以及为运行您的镜像的部署提供负载均衡访问的服务。
OpenShift Container Platform 会自动检测要使用管道、源或 docker 构建策略,如果进行源构建,则还检测适当的语言构建器镜像。
3.3.1.1. Local
从本地目录中的 Git 存储库创建应用程序:
$ oc new-app /<path to source code>
如果使用本地 Git 存储库,该存储库必须具有一个名为 origin
的远程源,指向可由 OpenShift Container Platform 集群访问的 URL。如果没有可识别的远程源,运行 new-app
命令将创建一个二进制构建。
3.3.1.2. 远程
从远程 Git 存储库创建新应用程序:
$ oc new-app https://github.com/sclorg/cakephp-ex
从私有远程 Git 存储库创建应用程序:
$ oc new-app https://github.com/youruser/yourprivaterepo --source-secret=yoursecret
如果使用私有远程 Git 存储库,您可以使用 --source-secret
标志指定一个现有源克隆 secret,此 secret 将注入到构建配置中以访问存储库。
您可以通过指定 --context-dir
标志来使用源代码存储库的子目录。从远程 Git 存储库和上下文子目录创建应用程序:
$ oc new-app https://github.com/sclorg/s2i-ruby-container.git \ --context-dir=2.0/test/puma-test-app
另外,在指定远程 URL 时,您可以通过在 URL 末尾附加 #<branch_name>
来指定要使用的 Git 分支:
$ oc new-app https://github.com/openshift/ruby-hello-world.git#beta4
3.3.1.3. 构建策略检测
OpenShift Container Platform 通过检测某些文件自动决定要使用的构建策略:
在创建新应用程序时,如果源存储库的根目录或指定上下文目录中存在 Jenkinsfile 文件,则 OpenShift Container Platform 会生成管道构建策略。
注意pipeline
构建策略已弃用;请考虑使用 Red Hat OpenShift Pipelines。- 在创建新应用程序时,如果源存储库的根目录或指定上下文目录中存在 Dockerfile,则 OpenShift Container Platform 会生成 docker 构建策略。
- 如果没有检测到 Jenkins 文件或 Dockerfile,OpenShift Container Platform 会生成源构建策略。
通过将 --strategy
标志设置为 docker
、pipeline
或 source
来覆盖自动检测到的构建策略。
$ oc new-app /home/user/code/myapp --strategy=docker
oc
命令要求包含构建源的文件在远程 Git 存储库中可用。对于所有 Source 构建,您必须使用 git remote -v
。
3.3.1.4. 语言检测
如果您使用源构建策略, new-app
会尝试根据存储库根目录或指定上下文目录中是否存在特定文件来确定要使用的语言构建器:
语言 | 文件 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
检测了语言后,new-app
会在 OpenShift Container Platform 服务器上搜索具有与所检测语言匹配的 suppors
注解的镜像流标签,或与所检测语言的名称匹配的镜像流。如果找不到匹配项,new-app
会在 Docker Hub registry 中搜索名称上与所检测语言匹配的镜像。
您可以通过指定镜像(镜像流或容器规格)和存储库(以 ~
作为分隔符),来覆盖构建器用于特定源存储库的镜像。请注意,如果进行这一操作,就不会执行构建策略检测和语言检测。
例如,使用 myproject/my-ruby
镜像流以及位于远程存储库中的源:
$ oc new-app myproject/my-ruby~https://github.com/openshift/ruby-hello-world.git
使用 openshift/ruby-20-centos7:latest
容器镜像流以及本地仓库中的源:
$ oc new-app openshift/ruby-20-centos7:latest~/home/user/code/my-ruby-app
语言检测需要在本地安装 Git 客户端,以便克隆并检查您的存储库。如果 Git 不可用,您可以使用 <image>~<repository>
语法指定要与存储库搭配使用的构建器镜像,以避免语言检测步骤。
调用 -i <image> <repository>
需要 new-app
尝试克隆 repository
,从而判断其工件类型;如果 Git 不可用,此操作会失败。
调用 -i <image> --code <repository>
需要 new-app
克隆 repository
,从而能判断 image
应用作源代码的构建器,还是另外部署(使用数据库镜像时)。
3.3.2. 从镜像创建应用程序
您可以从现有镜像部署应用程序。镜像可以来自 OpenShift Container Platform 服务器中的镜像流、特定 registry 中的镜像或本地 Docker 服务器中的镜像。
new-app
命令尝试确定传递给它的参数中指定的镜像类型。但是,您可以使用 --docker-image
参数明确告知 new-app
镜像是一个容器镜像,或使用 -i|--image-stream
参数明确告知镜像是一个镜像流。
如果指定本地 Docker 存储库中的镜像,必须确保同一镜像可供 OpenShift Container Platform 节点使用。
3.3.2.1. Docker Hub MySQL 镜像
从 Dockerhub MySQL 镜像创建应用程序,例如:
$ oc new-app mysql
3.3.2.2. 私有 registry 中的镜像
使用私有 registry 中的镜像创建应用程序时,请指定完整容器镜像规格:
$ oc new-app myregistry:5000/example/myimage
3.3.2.3. 现有镜像流和可选镜像流标签
从现有镜像流和可选镜像流标签创建应用程序:
$ oc new-app my-stream:v1
3.3.3. 从模板创建应用程序
您可以使用之前存储的模板或模板文件创建应用程序,方法是将模板名称指定为参数。例如,您可以存储一个示例应用程序模板,并使用它来创建应用程序。
将应用程序模板上传到当前项目的模板库。以下示例从名为 example/sample-app/application-template-stibuild.json
的文件上传一个应用程序模板:
$ oc create -f examples/sample-app/application-template-stibuild.json
然后,通过引用应用程序模板来创建新应用程序。在本例中,模板名称为 ruby-helloworld-sample
:
$ oc new-app ruby-helloworld-sample
要通过引用本地文件系统中的模板文件创建新应用程序,而无需首先将其保存到 OpenShift Container Platform 中,使用 -f|--file
参数。例如:
$ oc new-app -f examples/sample-app/application-template-stibuild.json
3.3.3.1. 模板参数
在基于模板创建应用程序时,请使用 -p|--param
参数来设置模板定义的参数值:
$ oc new-app ruby-helloworld-sample \ -p ADMIN_USERNAME=admin -p ADMIN_PASSWORD=mypassword
您可以将参数保存到文件中,然后在实例化模板时通过 --param-file
来使用该文件。如果要从标准输入中读取参数,请使用 --param-file=-
。以下是一个名为 helloworld.params
的示例文件:
ADMIN_USERNAME=admin ADMIN_PASSWORD=mypassword
在实例化模板时引用文件中的参数:
$ oc new-app ruby-helloworld-sample --param-file=helloworld.params
3.3.4. 修改应用程序创建
new-app
命令生成用于构建、部署和运行所创建应用程序的 OpenShift Container Platform 对象。通常情况下,这些对象是在当前项目中创建的,并分配有从输入源存储库或输入镜像中获得的名称。但是,您可以使用 new-app
修改这种行为。
对象 | 描述 |
---|---|
|
为命令行中指定的每个源存储库创建一个 |
|
对于 |
|
创建一个 |
|
|
其他 | 根据模板,可在实例化模板时生成其他对象。 |
3.3.4.1. 指定环境变量
从模板、源或镜像生成应用程序时,您可以在运行时使用 -e|--env
参数将环境变量传递给应用程序容器:
$ oc new-app openshift/postgresql-92-centos7 \ -e POSTGRESQL_USER=user \ -e POSTGRESQL_DATABASE=db \ -e POSTGRESQL_PASSWORD=password
这些变量可使用 --env-file
参数从文件中读取。以下是一个名为 postgresql.env
的示例文件:
POSTGRESQL_USER=user POSTGRESQL_DATABASE=db POSTGRESQL_PASSWORD=password
从文件中读取变量:
$ oc new-app openshift/postgresql-92-centos7 --env-file=postgresql.env
另外,也可使用 --env-file=-
在标准输入上给定环境变量:
$ cat postgresql.env | oc new-app openshift/postgresql-92-centos7 --env-file=-
在 new-app
处理过程中创建的任何 BuildConfig
对象,都不能使用通过 -e|--env
或 --env-file
参数传递的环境变量进行更新。
3.3.4.2. 指定构建环境变量
从模板、源或镜像生成应用程序时,您可以在运行时使用 --build-env
参数将环境变量传递给构建容器:
$ oc new-app openshift/ruby-23-centos7 \ --build-env HTTP_PROXY=http://myproxy.net:1337/ \ --build-env GEM_HOME=~/.gem
这些变量可使用 --build-env-file
参数从文件中读取。以下是一个名为 ruby.env
的示例文件:
HTTP_PROXY=http://myproxy.net:1337/ GEM_HOME=~/.gem
从文件中读取变量:
$ oc new-app openshift/ruby-23-centos7 --build-env-file=ruby.env
另外,也可使用 --build-env-file=-
在标准输入上给定环境变量:
$ cat ruby.env | oc new-app openshift/ruby-23-centos7 --build-env-file=-
3.3.4.3. 指定标签
从源、镜像或模板生成应用程序时,您可以使用 -l|--label
参数为创建的对象添加标签。借助标签,您可以轻松地集中选择、配置和删除与应用程序关联的对象。
$ oc new-app https://github.com/openshift/ruby-hello-world -l name=hello-world
3.3.4.4. 查看输出但不创建
要查看运行 new-app
命令的空运行,您可以使用 -o|--output
参数及 yaml
或 json
值。然后,您可以使用输出结果预览创建的对象,或将其重定向到可以编辑的文件。满意之后,您可以使用 oc create
创建 OpenShift Container Platform 对象。
要将 new-app
工件输出到一个文件,请运行以下命令:
$ oc new-app https://github.com/openshift/ruby-hello-world \ -o yaml > myapp.yaml
编辑该文件:
$ vi myapp.yaml
通过引用该文件来创建新应用程序:
$ oc create -f myapp.yaml
3.3.4.5. 使用其他名称创建对象
new-app
创建的对象通常命名自用于生成它们的源存储库或镜像。您可以通过在命令中添加 --name
标志来设置生成的对象名称:
$ oc new-app https://github.com/openshift/ruby-hello-world --name=myapp
3.3.4.6. 在另一项目中创建对象
通常,new-app
会在当前项目中创建对象。不过,您可以使用 -n|--namespace
参数在另一项目中创建对象:
$ oc new-app https://github.com/openshift/ruby-hello-world -n myproject
3.3.4.7. 创建多个对象
new-app
命令允许创建多个应用程序,为 new-app
指定多个参数便可实现。命令行中指定的标签将应用到单一命令创建的所有对象。环境变量应用到从源或镜像创建的所有组件。
从源存储库和 Docker Hub 镜像创建应用程序:
$ oc new-app https://github.com/openshift/ruby-hello-world mysql
如果以独立参数形式指定源代码存储库和构建器镜像,new-app
会将构建器镜像用作源代码存储库的构建器。如果这不是您的用意,请使用 ~
分隔符为源指定所需的构建器镜像。
3.3.4.8. 在单个 pod 中对镜像和源进行分组
new-app
命令允许在一个 pod 中一起部署多个镜像。要指定要将哪些镜像分组在一起,使用 +
分隔符。也可使用 --group
命令行参数来指定应分组在一起的镜像。要将源存储库中构建的镜像与其他镜像一起分组,请在组中指定其构建器镜像:
$ oc new-app ruby+mysql
将通过源构建的镜像和外部镜像一起部署:
$ oc new-app \ ruby~https://github.com/openshift/ruby-hello-world \ mysql \ --group=ruby+mysql
3.3.4.9. 搜索镜像、模板和其他输入
要搜索镜像、模板和 oc new-app
命令的其他输入,使用 --search
和 --list
。例如,查找包含 PHP 的所有镜像或模板:
$ oc new-app --search php
3.3.4.10. 设置导入模式
要使用 oc new-app
来设置导入模式,请添加 --import-mode
标志。此标志可以附加 Legacy
或 PreserveOriginal
,它允许用户分别使用单个子清单或所有清单创建镜像流的选项。
$ oc new-app --image=registry.redhat.io/ubi8/httpd-24:latest --import-mode=Legacy --name=test
$ oc new-app --image=registry.redhat.io/ubi8/httpd-24:latest --import-mode=PreserveOriginal --name=test