programing

Alpine 리눅스 기반 오라클

lastcode 2023. 8. 5. 10:17
반응형

Alpine 리눅스 기반 오라클

Alpine Linux Docker 환경에 OCI8 확장을 설치하려고 합니다.효과가 없을 것이라고 말하는 곳이 몇 군데 있지만 실제로 효과가 있다고 말하는 곳도 있습니다.나는 있습니다3.4버전과 기업의 이유로 현재는 그렇게 유지되고 있습니다.

저는 도커 회의에서 이 일을 했습니다.

# Install Oracle Client and build OCI8 (Oracel Command Interface 8 - PHP extension)
USER root
ENV LD_LIBRARY_PATH=/usr/local/instantclient
ENV ORACLE_HOME=/usr/local/instantclient

RUN apk update && apk upgrade
RUN apk add musl-dev libaio autoconf && apk add --update make

## Unzip Instant Client v12
RUN pecl channel-update pecl.php.net
COPY instantclient_12_2.zip /var/www/html/instantclient_12_2.zip
RUN unzip -d /usr/local/ /var/www/html/instantclient_12_2.zip
RUN ln -s /usr/local/instantclient_12_2 /${ORACLE_HOME} && \
    ln -s /${ORACLE_HOME}/libclntsh.so.* /${ORACLE_HOME}/libclntsh.so && \
    ln -s /${ORACLE_HOME}/libocci.so.* /${ORACLE_HOME}/libocci.so && \
    ln -s /${ORACLE_HOME}/lib* /usr/lib && \
    ln -s /${ORACLE_HOME}/sqlplus /usr/bin/sqlplus &&\
    ln -s /usr/lib/libnsl.so.2.0.0  /usr/lib/libnsl.so.1

RUN apk add gcc; exit 0 # This has a history of failing sometimes

RUN echo "instantclient,/usr/local/instantclient" | pecl install oci8 &&\
    echo 'extension=oci8.so' > /usr/local/etc/php/conf.d/30-oci8.ini &&\
    rm -rf /tmp/*.zip /var/cache/apk/* /tmp/pear/

이제 빌드가 통과하고 괜찮아 보이지만, 제가 할 때는php -v다음을 확인할 수 있습니다.

PHP 경고: PHP 시작:동적 라이브러리 '/usr/local/lib/module/extensions/no-module-non-zts-20160303/oci8.so '을(를) 로드할 수 없습니다. 공유 라이브러리 libnsl.so .1을 로드하는 동안 오류가 발생했습니다. 0줄에서 알 수 없는 위치에 해당 파일 또는 디렉토리(/usr/local/moduleclient/libclntsh.so .1에서 필요함)가 없습니다.

PHP 버전은7.1.12.

내가 노력한 것은 하는 것입니다.apk add libnsl하지만 이 오류가 반환됩니다.

오류: 만족할 수 없는 제약 조건: so:libtirpc.so .3(계속):

그래서 제가 추가를 해봤습니다.apk add libtirpc-dev('창구')libtirpc내 버전에 사용할 수 없음), 하지만 그것은 아무것도 바꾸지 않았습니다.

단서는?

알파인 및 인스턴트 클라이언트의 최신 버전과 함께 작업하기 위해 만든 도커 버전을 공유합니다.도커 이미지의 크기는 124MB입니다.

나는 당신이 다운로드할 수 있는 내 github을 공유합니다.

도커 + 알파인 + 인스턴트 클라이언트 Basiclite

또는 도커 파일의 내용을 아래에서 볼 수 있습니다.

FROM alpine:latest
# Install Instantclient Basic Light Oracle and Dependencies
RUN apk --no-cache add libaio libnsl libc6-compat curl && \
cd /tmp && \
curl -o instantclient-basiclite.zip https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip -SL && \
unzip instantclient-basiclite.zip && \
mv instantclient*/ /usr/lib/instantclient && \
rm instantclient-basiclite.zip && \
ln -s /usr/lib/instantclient/libclntsh.so.19.1 /usr/lib/libclntsh.so && \
ln -s /usr/lib/instantclient/libocci.so.19.1 /usr/lib/libocci.so && \
ln -s /usr/lib/instantclient/libociicus.so /usr/lib/libociicus.so && \
ln -s /usr/lib/instantclient/libnnz19.so /usr/lib/libnnz19.so && \
ln -s /usr/lib/libnsl.so.2 /usr/lib/libnsl.so.1 && \
ln -s /lib/libc.so.6 /usr/lib/libresolv.so.2 && \
ln -s /lib64/ld-linux-x86-64.so.2 /usr/lib/ld-linux-x86-64.so.2

ENV ORACLE_BASE /usr/lib/instantclient
ENV LD_LIBRARY_PATH /usr/lib/instantclient
ENV TNS_ADMIN /usr/lib/instantclient
ENV ORACLE_HOME /usr/lib/instantclient

제가 답이 늦을 수도 있습니다.저는 알파인 베이스 이미지를 가지고 있는 것과 같은 문제를 겪었고 거기에 오라클 클라이언트를 추가했습니다.그래서 저는 이 해결책을 생각해냈습니다 - https://github.com/Shrinidhikulkarni7/OracleClient_Alpine

여기 도커 파일이 있지만 작동하려면 셸 스크립트도 필요합니다.

FROM alpine:latest

ENV LD_LIBRARY_PATH=/lib

RUN wget https://download.oracle.com/otn_software/linux/instantclient/193000/instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
    unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
    cp -r instantclient_19_3/* /lib && \
    rm -rf instantclient-basic-linux.x64-19.3.0.0.0dbru.zip && \
    apk add libaio

ADD script.sh /root/script.sh

RUN /root/script.sh

여기서 저는 오라클 클라이언트 내부 이미지를 직접 다운로드하여 경로를 설정하고 패키지를 추가한 다음 마지막으로 심볼릭 링크를 만들기 위해 셸 스크립트를 사용합니다.

저는 Oracle에서 지원하는 운영 체제를 사용하여 Alpine을 해킹하는 번거로움과 중요한 시기에 넘어가지 않는 불확실성을 피할 것을 권장합니다.따라서 비즈니스에 부정적인 영향을 미치지 않을 것이라는 확신을 갖게 됩니다.https://github.com/oracle/docker-images/tree/master/OracleInstantClient 을 사용해 보십시오.

기타 댓글

  • 인스턴트 클라이언트를 사용할 때는 ORACLE_HOME을 설정하지 마십시오.이 변수는 전체 소프트웨어 설치에 사용됩니다.
  • ldconfig를 사용하여 시스템 라이브러리 경로를 설정합니다. 여기에서 Instant Client 설치 지침을 참조하십시오.
  • 12.2가 가능한 동일한 DB 버전에 연결할 수 있는 Instant Client 19를 사용합니다. (19는 새 버전 시스템에서 실제로 터미널 12.2 릴리스로 이름이 변경되었습니다.)
  • Oracle Linux Docker 이미지를 사용하면 사용자가 수동으로 다운로드할 필요 없이 19 Instant Client를 다운로드하여 설치할 수 있다는 장점이 있습니다.

사용하는 '슬림' Oracle Linux 컨테이너에 대한 자세한 내용은 이 블로그를 참조하십시오.

Oracle-CLIENT를 사용한 Golang의 도커 파일입니다.

FROM golang:alpine

RUN apk update

ENV CLIENT_FILENAME instantclient-basic-linux.x64-12.1.0.1.0.zip

WORKDIR /opt/oracle/lib

ADD https://github.com/bumpx/oracle-instantclient/raw/master/${CLIENT_FILENAME} .

RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
apk add --update libaio libnsl && \
ln -s /usr/lib/libnsl.so.2 /usr/lib/libnsl.so.1

RUN LIBS="*/libociei.so */libons.so */libnnz12.so */libclntshcore.so.12.1 */libclntsh.so.12.1" && \
unzip ${CLIENT_FILENAME} ${LIBS} && \
for lib in ${LIBS}; do mv ${lib} /usr/lib; done && \
ln -s /usr/lib/libclntsh.so.12.1 /usr/lib/libclntsh.so && \
rm ${CLIENT_FILENAME}

RUN mkdir /app

ADD . /app

WORKDIR /app

RUN apk add git
RUN apk add libc-dev
RUN apk add gcc

RUN go mod tidy
RUN go build -o main .

CMD ["/app/main"]

저는 오라클용 Godror Golang Driver를 사용하여 이와 유사한 문제를 해결하고 있었습니다.저는 알파인 이미지를 사용하여 이 문제를 해결할 수 없었습니다.문제는 결국 libint.sh 이 시스템에서 인식할 수 있도록 완전히 설치되지 않는다는 것입니다.도커 파일을 Glibc 라이브러리를 사용하도록 변경하기도 합니다.

결국 문제를 해결한 방법은 Oracle 자체의 이미지를 사용하는 것이었습니다.여기서 볼 수 있는 슬림한 이미지가 아닌 풀 버전: https://github.com/oracle/docker-images/tree/master/OracleLinuxDevelopers

그런 다음 필요한 경우 Golang을 설치하고 Instant 클라이언트 및 Oracle 종속성을 설치해야 합니다.

FROM oraclelinux:7 as builder
RUN yum install -y oracle-golang-release-el7 && \
    yum install -y git && \
    yum install -y golang unzip

COPY . /app
RUN go version
WORKDIR /app
{Your Docker Specific Commands Here}

{Insert Build Specific Environment Variables here}
#Oracle Specific Environment Variables
{Insert Oracle Env Variables here}

WORKDIR /root/
#Install oracle dependencies
RUN yum install -y wget unzip libaio && \
    rm -rf /var/cache/yum
#install Oracle Instant Client
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-basic-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient.zip && \
    unzip /tmp/instantclient.zip -d /usr/lib/instantclient && \
    rm /tmp/instantclient.zip

#Install Oracle SDK
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sdk-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip && \
    unzip /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
    rm /tmp/instantclient-sdk-linux.x64-19.9.0.0.0.zip

#Install Oracle Tools through SQLPlus
RUN wget https://download.oracle.com/otn_software/linux/instantclient/199000/instantclient-sqlplus-linux.x64-19.9.0.0.0dbru.zip -O /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip && \
    unzip /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip -d /usr/lib/ && \
    rm /tmp/instantclient-sqlplus-linux.x64-19.9.0.0.0.zip

WORKDIR /app

COPY --from=builder /app/cmd/svr .
EXPOSE 8000

CMD ["./app"]

이것이 제가 골랑 API의 문제를 해결한 방법입니다.Alpine 문제를 해결한 다른 문제도 있을 수 있지만 이전 버전의 Oracle Instant Client를 사용하더라도 문제를 해결할 수 없었습니다.

이 도커 파일을 사용해 보십시오.기본 Alpine Linux 이미지에서 시작하여 필요한 패키지를 추가합니다.

FROM alpine:3.13

WORKDIR /project

RUN wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-basiclite-linux.x64-21.1.0.0.0.zip -qO- | busybox  unzip -q - && \
    wget https://download.oracle.com/otn_software/linux/instantclient/211000/instantclient-sqlplus-linux.x64-21.1.0.0.0.zip -qO- | busybox  unzip -q - && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.33-r0/glibc-2.33-r0.apk -q

RUN apk add --allow-untrusted libaio glibc-2.33-r0.apk

RUN cd instantclient_21_1 && cp /usr/lib/libaio.so.1 /lib/libc.musl-x86_64.so.1 . && chmod +x sqlplus

ENV LD_LIBRARY_PATH=/project/instantclient_21_1

언급URL : https://stackoverflow.com/questions/53263972/oracle-on-alpine-linux

반응형