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
'programing' 카테고리의 다른 글
레일에서 Ajax 호출의 성공 또는 실패를 간단히 반환 (0) | 2023.08.05 |
---|---|
외부 장치에서 로컬로 Laravel 5 앱에 액세스 (0) | 2023.08.05 |
엔티티 프레임워크 동일한 테이블 다대다 관계 (0) | 2023.08.05 |
특정 컨테이너에 대해서만 도커 포장 (0) | 2023.08.05 |
스위프트에서 십진수를 이진수로 변환하는 방법은 무엇입니까? (0) | 2023.08.05 |