Cloud Foundry buildpack 개발 배포 인스턴스 분석

7214 단어 cloudbuildpackfoundry
기본 원리
CF가 응용 프로그램을 실행하는 기본 과정은 사용자가 발표한 응용 프로그램 패키지를 압축을 풀고 자신의 모든build 패키지를 가져와 지정한 순서에 따라 패키지와 일치하게 하고 이 코드를 실행할 수 있는build 패키지를 찾을 때까지build 패키지를 풀고 이 응용 코드와 패키지(droplet)를 만들어 지정한 실행 환경 파라미터에 따라 용기를 생성하여droplet를 던져 넣는 것이다.buildpack에서 지정한 시작 명령에 따라 응용을 시작합니다.위의 과정에서buildpack은 세 가지 기능을 실현했다. 첫 번째,detect: 현재 응용 프로그램 패키지가 이buildpack으로 실행될 수 있는지 검사한다. 예를 들어javabuildpack은WEB-INF 경로를 발견하면 자신이 실행할 수 있다고 생각한다.두 번째 단계,compile: 응용 프로그램 패키지와buildpack 패키지를 융합시킨다. 예를 들어 자바 프로그램 패키지를tomcat의 응용 디렉터리에 놓고 일부 파라미터를 바꾼다. 예를 들어 현재 dea의 무작위 포트에 이tomcat의 실례를 부여한다.세 번째,release:droplet을 시작합니다. 예를 들어tomcat을 실행하는 startup.sh.모든buildpack에bin 경로가 있고 지정된 이름 (detect,compile,release) 의 스크립트 세 개가 놓여 있으며, 구체적인 실현 논리는 여기서 터치됩니다.다음은javabuildpack를 예로 삼아 세 가지 실제 수요를 통해buildpack의 개발과 사용을 소개할 것이다.
사용자 정의buildpack
자바 응용 프로그램의 기본 시간대와 인코딩 업데이트
요구 사항
국제 소프트웨어는 모두 그리니치 시간을 시스템의 기본 시간으로 사용하기 때문에 우리가 쓴 로그나 프로그램 코드로 얻은 시스템 시간(사실은 모두 dea의 시스템 시간)은 모두 +0000이고 우리는 +0800이 필요하다. 물론 코드에서 스스로 처리할 수 있다.그러나 내 사용자들은 기분이 좋지 않다. 그들은 내가 이 프로그램을 로컬로 테스트해야 한다고 말한다. 너무 어지러우니 네가 나에게 처리해야 한다.Tomcat의 기본 인코딩은 모두utf8이어야 하지만, 일부 장면에서, 예를 들어 Tomcat에서 실행되는rest 서비스의 경우, 메시지에 중국어가 포함되어 있어 정상적으로 수신할 수 없습니다.CF의javabuildpack에 포함된 것이 기본적인tomcat이기 때문에 이 문제를 해결하기 위해 아래의 명령을 사용하여 설정할 수 있습니다. 그러나 시원하지 않기 때문에buildpack을 직접 고치는 것이 좋습니다.
cf set-env appname CATALINA_OPTS "$CATALINA_OPTS -Dfile.encoding=UTF-8"

솔루션
자바buildpack는 루비가 쓴 것이기 때문에 원칙적인 변동이 아니라면 압축 패키지를 열고 루비 코드를 수정한 다음에 압축하는 방법을 사용할 수 있습니다.그러나 winrar는 엉뚱한 문제가 있는 것 같습니다. 압축을 풀고 압축하면 문제가 있을 수 있지만, 수정된 동명 파일을 winrar의 창으로 직접 드래그해서 바꾸면 작업을 할 수 있습니다.시간대와 인코딩 두 가지 요구 사항을 충족하기 위해 필요한 파일은 다음과 같습니다.
java-buildpack-offline-v#.#.#\lib\java_buildpack\component\java_opts.rb에는 다음 두 가지 방법이 추가되었습니다.
# @return [JavaOpts]              +self+-Duser.timezone 
def add_timezone(value)
    self << "-Duser.timezone=#{value}"
    self
end
# @return [JavaOpts]              +self+-Dfile.encoding 
def add_fileencode(value)
    self << "-Dfile.encoding=#{value}"
    self
end

java-buildpack-offline-v#.#.#\lib\java_buildpack\jre\open_jdk_like.rb에서 release 방법을 수정하고add 증가timezone 및 addfileencode 호출
@droplet.java_opts
    .add_system_property('java.io.tmpdir', '$TMPDIR')
    .add_option('-XX:OnOutOfMemoryError', killjava)
    .add_timezone('GMT+08')
    .add_fileencode('UTF-8')
    .concat memory

수정 후 이 두 파일을 원래의 오프라인buildpack 패키지로 교체한 다음 CF에 발표하여 현재buildpack 상황을 보십시오:
cf buidlpacks

그리고 새buildpack을 만듭니다. 마지막 매개 변수는 cf가buildpack을 보기 위한 순서에 따라 실제 상황에 따라 조정해야 합니다.
cf create-buildpack java_buildpack_with_gmt0800_offline d:\somedir\java-buildpack-with-gmt0800-offline-v2.4.zip 1

업데이트된 경우 cf update-buildpack를 사용합니다.
프로그램 패키지를 사용하는tomcat
요구 사항
일부 응용, 특히 제품을 만드는 회사가 하는tomcat에 대해 일정한 커팅을 하는데 이런 응용이 cf로 옮겨갈 때 매우 고통스럽다.간단한 방법은 jre만 제공하는 build 패키지를 만드는 것이다.
솔루션
이 제품의 ID가 LiveBOS라고 가정하면 패키지의 첫 번째 경로 아래에 LiveBOS 폴더가 있습니다.
java-buildpack-with-livebos-offline-v#.#\lib\java_buildpack\container\에 libe 추가bos.rb:
# Encoding: utf-8
# Cloud Foundry Java Buildpack
# Copyright 2013 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'java_buildpack/container'
require 'java_buildpack/container/dist_zip_like'
require 'java_buildpack/util/dash_case'

module JavaBuildpack
    module Container

        # Encapsulates the detect, compile, and release functionality for +LiveBOS+ style applications.
        class LiveBOS < JavaBuildpack::Container::DistZipLike
            # Creates an instance
            #
            # @param [Hash] context a collection of utilities used the component
            def initialize(context)
                super(context)
            end

            # (see JavaBuildpack::Component::BaseComponent#compile)
            def compile
                startup.chmod 0755
            end

            # (see JavaBuildpack::Component::BaseComponent#release)
            def release
              @droplet.java_opts.add_system_property 'http.port', '$PORT'

                [
                    @droplet.java_home.as_env_var,
                    @droplet.java_opts.as_env_var,
                    qualify_path(catalina, @droplet.root), 
                    'run'
                ].flatten.compact.join(' ')
            end

            protected

            # (see JavaBuildpack::Container::DistZipLike#id)
            def id
                LiveBOS.to_s.dash_case
            end

            # (see JavaBuildpack::Container::DistZipLike#supports?)
            def supports?
                livebos? && catalina.exist?
            end

            private

            def startup
                candidates = (root + 'bin/startup.sh').glob
                candidates.size == 1 ? candidates.first : nil
            end

            def catalina
                candidates = (root + 'bin/catalina.sh').glob
                candidates.size == 1 ? candidates.first : nil
            end

            def livebos?
                (root + 'LiveBos').exist?
            end

        end

    end
end

java-buildpack-with-livebos-offline-v2.4\config\components.yml containers 아래에 추가:
- "JavaBuildpack::Container::LiveBOS"

뒤에 포장해서 나왔어요.
buildpack에서 jre 바꾸기
요구 사항
일부 응용 프로그램은 특정 버전의 jre만 사용할 수 있습니다. 만약 이 jre가 비교적 새것이라면 쉽지만, 예를 들어 1.6이라면 현재 cf에서 찾을 수 있는build 패키지는 모두 지원되지 않습니다.또한oracle jre를 사용해야 할 수도 있습니다. (cf에서 기본값은open jre입니다.)
솔루션
시작하기 전에 윈도우즈에서 이 컴파일 과정을 시도하지 않는 것을 권장합니다. 기본적으로 성공할 가능성이 없습니다. 인터넷에 접속해서 루비를 실행할 수 있는 linux를 마음대로 찾아보세요.
java-buildpack-offline-v2 수정.4\config\components.yml, 사용하지 않는 jre 주석을 삭제합니다.
  - "JavaBuildpack::Jre::OpenJdkJRE"
# - "JavaBuildpack::Jre::OracleJRE"

java-buildpack-offline-v2 수정.4\config\oracle_jre.yml, 다음 줄의 내용을 로컬 토마토캣의 주소로 업데이트합니다.
repository_root: http://localhost:8080/myapp

로컬 my app 아래에 index를 놓으십시오.yml 파일입니다. 아래 내용과 유사한oracle jre 다운로드 주소를 넣으십시오. 만약oracle 사이트에서 찾을 수 없으면 로컬tomcat에도 놓으십시오.
---
1.7.0_01: http://download.run.pivotal.io/openjdk/centos6/x86_64/openjdk-1.7.0_01.tar.gz
......
1.8.0_M6: http://download.run.pivotal.io/openjdk/centos6/x86_64/openjdk-1.8.0_M6.tar.gz

그리고 포장을 컴파일할 수 있습니다.
bundle install
bundle exec rake package OFFLINE=true
...
Creating build/java-buildpack-offline-cfd6b17.zip

마지막으로 당연히 cf에 발표됩니다.

좋은 웹페이지 즐겨찾기