×

从源代码创建应用程序

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

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

OpenShift Container Platform 会自动检测应该使用流水线、源代码或 Docker 构建策略,并且在源代码构建的情况下,会检测合适的语言构建器镜像。

本地

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

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

如果您使用本地 Git 仓库,则该仓库必须具有名为 origin 的远程仓库,该远程仓库指向 OpenShift Container Platform 集群可访问的 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

构建策略检测

OpenShift Container Platform 通过检测某些文件来自动确定要使用的构建策略

  • 在创建新应用程序时,如果源代码仓库的根目录或指定的上下文目录中存在 Jenkinsfile,则 OpenShift Container Platform 将生成流水线构建策略。

    pipeline 构建策略已弃用;建议改用 Red Hat OpenShift Pipelines。

  • 在创建新应用程序时,如果源代码仓库的根目录或指定的上下文目录中存在 Dockerfile,则 OpenShift Container Platform 将生成 Docker 构建策略。

  • 如果未检测到 Jenkinsfile 或 Dockerfile,则 OpenShift Container Platform 将生成源代码构建策略。

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

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

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

语言检测

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

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

dotnet

project.json, *.csproj

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 将在 OpenShift Container Platform 服务器上搜索具有与检测到的语言匹配的 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 用作源代码的构建器,或者像数据库镜像一样单独部署。

从镜像创建应用

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

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

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

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

要通过引用本地文件系统中的模板文件(无需先将其存储在 OpenShift Container Platform 中)来创建新应用,请使用 -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 命令生成 OpenShift Container Platform 对象,这些对象构建、部署和运行创建的应用。通常情况下,这些对象是在当前项目中创建的,并分配从输入源代码库或输入镜像派生的名称。但是,使用 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 创建 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

创建具有不同名称的对象

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