×

从源代码创建应用

使用new-app命令,您可以从本地或远程Git仓库中的源代码创建应用。

new-app命令创建一个构建配置,该配置本身会从您的源代码创建一个新的应用镜像。new-app命令通常还会创建一个Deployment对象来部署新镜像,以及一个服务来提供对运行您镜像的部署的负载均衡访问。

AWS上的Red Hat OpenShift服务会自动检测应该使用流水线、源代码或Docker构建策略,在源代码构建的情况下,会检测合适的语言构建器镜像。

本地

要从本地目录中的Git仓库创建应用:

$ oc new-app /<path to source code>

如果您使用本地Git仓库,则该仓库必须有一个名为origin的远程仓库,该远程仓库指向AWS上的Red Hat OpenShift服务集群可以访问的URL。如果没有识别的远程仓库,运行new-app命令将创建一个二进制构建。

远程

要从远程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标志指定一个已存在的源代码克隆密钥,该密钥将被注入到您的构建配置中以访问仓库。

您可以通过指定--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

构建策略检测

AWS上的Red Hat OpenShift服务会通过检测某些文件来自动确定要使用的构建策略。

  • 在创建新应用时,如果源代码仓库的根目录或指定的上下文目录中存在Jenkinsfile,AWS上的Red Hat OpenShift服务将生成一个流水线构建策略。

    pipeline构建策略已弃用;请考虑改用Red Hat OpenShift Pipelines。

  • 在创建新应用时,如果源代码仓库的根目录或指定的上下文目录中存在Dockerfile,AWS上的Red Hat OpenShift服务将生成一个Docker构建策略。

  • 如果未检测到Jenkinsfile和Dockerfile,AWS上的Red Hat OpenShift服务将生成一个源代码构建策略。

通过将--strategy标志设置为dockerpipelinesource来覆盖自动检测到的构建策略。

$ oc new-app /home/user/code/myapp --strategy=docker

oc命令要求包含构建源的文件可在远程Git仓库中访问。对于所有源代码构建,您必须使用git remote -v

语言检测

如果您使用源代码构建策略,new-app将尝试通过仓库的根目录或指定的上下文目录中某些文件的存在来确定要使用的语言构建器。

表1. new-app检测到的语言
语言 文件

jee

pom.xml

nodejs

app.json, package.json

perl

cpanfile, index.pl

php

composer.json, index.php

python

requirements.txt, setup.py

ruby

Gemfile, Rakefile, config.ru

scala

build.sbt

golang

Godeps, main.go

检测到语言后,new-app会在AWS上的Red Hat OpenShift服务服务器上搜索具有与检测到的语言匹配的supports批注的镜像流标签,或与检测到的语言名称匹配的镜像流。如果找不到匹配项,new-app会在Docker Hub注册表中搜索基于名称与检测到的语言匹配的镜像。

您可以通过指定镜像(镜像流或容器规范)和带有~分隔符的仓库来覆盖特定源代码仓库使用的构建器镜像。请注意,如果这样做,则不会执行构建策略检测和语言检测。

例如,要将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用作源代码的构建器,或者单独部署,例如数据库镜像。

从镜像创建应用

您可以从现有镜像部署应用。镜像可以来自AWS上的Red Hat OpenShift服务服务器中的镜像流、特定注册表中的镜像或本地Docker服务器中的镜像。

new-app 命令尝试确定传递给它的参数中指定的镜像类型。但是,您可以使用 --docker-image 参数显式告诉 new-app 镜像是容器镜像,或者使用 -i|--image-stream 参数指定镜像流。

如果您指定来自本地 Docker 仓库的镜像,则必须确保 Red Hat OpenShift Service on AWS 集群节点上也可用相同的镜像。

Docker Hub MySQL 镜像

例如,从 Docker Hub MySQL 镜像创建应用程序

$ oc new-app mysql

私有注册表中的镜像

使用私有注册表中的镜像创建应用程序,请指定完整的容器镜像规范

$ oc new-app myregistry:5000/example/myimage

现有镜像流和可选镜像流标签

从现有镜像流和可选镜像流标签创建应用程序

$ oc new-app my-stream:v1

从模板创建应用程序

您可以通过指定模板名称作为参数,从先前存储的模板或模板文件创建应用程序。例如,您可以存储一个示例应用程序模板并使用它来创建应用程序。

将应用程序模板上传到您当前项目的模板库。以下示例将应用程序模板从名为 examples/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

要通过引用本地文件系统中的模板文件来创建新的应用程序,而无需先将其存储在 Red Hat OpenShift Service on AWS 中,请使用 -f|--file 参数。例如

$ oc new-app -f examples/sample-app/application-template-stibuild.json

模板参数

当基于模板创建应用程序时,使用 -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

修改应用程序创建

new-app 命令生成 Red Hat OpenShift Service on AWS 对象,这些对象构建、部署和运行创建的应用程序。通常,这些对象在当前项目中创建,并分配从输入源存储库或输入镜像派生的名称。但是,使用 new-app,您可以修改此行为。

表 2. new-app 输出对象
对象 描述

BuildConfig

为命令行中指定的每个源存储库创建一个 BuildConfig 对象。BuildConfig 对象指定要使用的策略、源位置和构建输出位置。

ImageStreams

对于 BuildConfig 对象,通常会创建两个镜像流。一个表示输入镜像。对于源构建,这是构建器镜像。对于 Docker 构建,这是 FROM 镜像。第二个表示输出镜像。如果将容器镜像指定为 new-app 的输入,则也会为该镜像创建一个镜像流。

DeploymentConfig

创建 DeploymentConfig 对象来部署构建的输出或指定的镜像。new-app 命令为结果 DeploymentConfig 对象中包含的容器中指定的全部 Docker 卷创建 emptyDir 卷。

Service

new-app 命令尝试检测输入镜像中的公开端口。它使用最低的数字公开端口来生成公开该端口的服务。要公开不同的端口,在 new-app 完成后,只需使用 oc expose 命令生成其他服务即可。

其他

根据模板,在实例化模板时可以生成其他对象。

指定环境变量

从模板、源或镜像生成应用程序时,可以使用 -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 参数传递的环境变量进行更新。

指定构建环境变量

从模板、源或镜像生成应用程序时,可以使用 --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=-

指定标签

从源代码、镜像或模板生成应用程序时,可以使用 -l|--label 参数向创建的对象添加标签。标签使您可以轻松地集体选择、配置和删除与应用程序关联的对象。

$ oc new-app https://github.com/openshift/ruby-hello-world -l name=hello-world

在不创建的情况下查看输出

要查看运行 new-app 命令的预演,可以使用带有 yamljson 值的 -o|--output 参数。然后,您可以使用输出预览创建的对象,或将其重定向到您可以编辑的文件。满意后,您可以使用 oc create 创建 Red Hat OpenShift Service on AWS 对象。

要将 new-app 工件输出到文件,请运行以下命令

$ oc new-app https://github.com/openshift/ruby-hello-world \
    -o yaml > myapp.yaml

编辑文件

$ vi myapp.yaml

通过引用文件创建一个新的应用程序

$ oc create -f myapp.yaml

创建具有不同名称的对象

new-app 创建的对象通常以用于生成它们的源存储库或镜像命名。您可以通过向命令添加 --name 标志来设置生成的对象的名称

$ oc new-app https://github.com/openshift/ruby-hello-world --name=myapp

在不同的项目中创建对象

通常情况下,new-app 会在当前项目中创建对象。但是,您可以使用 -n|--namespace 参数在不同的项目中创建对象

$ oc new-app https://github.com/openshift/ruby-hello-world -n myproject

创建多个对象

new-app 命令允许通过向 new-app 指定多个参数来创建多个应用程序。命令行中指定的标签适用于单个命令创建的所有对象。环境变量适用于从源代码或镜像创建的所有组件。

从源代码仓库和 Docker Hub 镜像创建应用程序

$ oc new-app https://github.com/openshift/ruby-hello-world mysql

如果源代码仓库和构建器镜像作为单独的参数指定,new-app 将使用构建器镜像作为源代码仓库的构建器。如果这不是预期目的,请使用 ~ 分隔符为源代码指定所需的构建器镜像。

在一个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

搜索镜像、模板和其他输入

要搜索 oc new-app 命令的镜像、模板和其他输入,请添加 --search--list 标志。例如,要查找所有包含 PHP 的镜像或模板

$ oc new-app --search php

设置导入模式

要在使用 oc new-app 时设置导入模式,请添加 --import-mode 标志。此标志可以附加 LegacyPreserveOriginal,分别为用户提供使用单个子清单或所有清单创建镜像流的选项。

$ 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