Мой docker-файл выглядит так
FROM store/oracle/database-instantclient:12.2.0.1
ENV OCI_LIB=/usr/lib/oracle/12.2/client64/lib
ENV OCI_INC=/usr/include/oracle/12.2/client64
ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${OCI_LIB}
ENV PATH=$PATH:/usr/lib/oracle/12.2/client64/bin
FROM rocker/rstudio
FROM rocker/tidyverse
и когда я запускаю docker build. Я вижу сообщение на консоли, говорящее следующее
Step 1/15 : FROM store/oracle/database-instantclient:12.2.0.1
12.2.0.1: Pulling from store/oracle/database-instantclient
497341ef9d71: Pulling fs layer
598d27c2564a: Pulling fs layer
497341ef9d71: Verifying Checksum
497341ef9d71: Download complete
497341ef9d71: Pull complete
598d27c2564a: Verifying Checksum
598d27c2564a: Download complete
598d27c2564a: Pull complete
Digest: sha256:e83a2a223a14f24e6e433847d15d817ff7799a3a1a2dd2e4b224437358e996a0
Status: Downloaded newer image for store/oracle/database-instantclient:12.2.0.1
Однако при исследовании файловой системы контейнера я не вижу никаких ссылок на «Oracle» во всей файловой системе.
Я делаю следующее для исследования
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash
Что происходит..??
решение1
Насколько я могу судить, последующие FROM
строки в Dockerfile ( FROM rocker/rstudio
...) стирают то, что было сделано. Окончательный образ контейнера — это то, что создается с последнего FROM и далее. Если вы хотите перенести что-то из образа, созданного ранее, вам придется явно КОПИРОВАТЬ их в ваш текущий образ. СмотритеДокументация Docker для многоэтапных сборок.
Я не уверен, что будет практично извлекать все, что требуется Oracle в исходном образе, чтобы скопировать его. Возможно, вам следует либо:
- установка/добавление элементов в образ Oracle.
- создайте первые два изображения, изображение Oracle, и скопируйте все в изображение Oracle.
- есть два контейнера, один с простым Oracle и один для других вещей, что является обычным способом решения задач.
решение2
У меня получилось следующее.
FROM oraclelinux:7-slim AS oracrap
RUN yum -y install oracle-release-el7 && yum-config-manager --enable ol7_oracle_instantclient && \
yum -y install oracle-instantclient18.5-basic oracle-instantclient18.5-devel oracle-instantclient18.5-sqlplus && \
rm -rf /var/cache/yum && \
echo /usr/lib/oracle/18.5/client64/lib > /etc/ld.so.conf.d/oracle-instantclient18.5.conf && \
ldconfig
ENV PATH=$PATH:/usr/lib/oracle/18.5/client64/bin
FROM rocker/rstudio:3.5.0
COPY --from=oracrap /usr/lib/oracle /usr/lib/oracle/
COPY --from=oracrap /usr/include/oracle /usr/include/oracle/
ENV PATH=$PATH:/usr/lib/oracle/18.5/client64/bin:/usr/lib/oracle/18.5/client64/lib:/usr/include/oracle/18.5/client64/
ENV OCI_LIB=/usr/lib/oracle/18.5/client64/lib
ENV OCI_INC=/usr/include/oracle/18.5/client64
ENV ORACLE_HOME=/usr/lib/oracle/18.5/client64
ENV LD_LIBRARY_PATH=/usr/lib/oracle/18.5/client64/lib
ENV LD_LIBRARY_PATH_64=/usr/lib/oracle/18.5/client64/lib
RUN ln -s /usr/lib/oracle/18.5/client64/lib/libclntsh.so.18.1 libclntsh.so.18.1
FROM rocker/tidyverse:3.5.0
COPY --from=oracrap /usr/lib/oracle /usr/lib/oracle/
COPY --from=oracrap /usr/include/oracle /usr/include/oracle/
ENV PATH=$PATH:/usr/lib/oracle/18.5/client64/bin:/usr/lib/oracle/18.5/client64/lib:/usr/include/oracle/18.5/client64/
ENV OCI_LIB=/usr/lib/oracle/18.5/client64/lib
ENV OCI_INC=/usr/include/oracle/18.5/client64
ENV ORACLE_HOME=/usr/lib/oracle/18.5/client64
ENV LD_LIBRARY_PATH=/usr/lib/oracle/18.5/client64/lib
ENV LD_LIBRARY_PATH_64=/usr/lib/oracle/18.5/client64/lib
RUN ln -s /usr/lib/oracle/18.5/client64/lib/libclntsh.so.18.1 libclntsh.so.18.1