多年来,我们已经使用类似下面的代码在本地构建了基础PHP-FPM容器映像,以包括Oracle DB支持:
ARG PHP_VERSION=7.4
ARG PHP_TYPE=fpm
FROM php:${PHP_VERSION}-${PHP_TYPE}
ENV LD_LIBRARY_PATH /usr/local/instantclient
ENV ORACLE_BASE /usr/local/instantclient
ENV ORACLE_HOME /usr/local/instantclient
ENV TNS_ADMIN /etc/oracle
COPY oracle /etc/oracle
RUN echo 'instantclient,/usr/local/instantclient' | pecl install oci8-${OCI8_VERSION} \
&& docker-php-ext-configure oci8 --with-oci8=instantclient,/usr/local/instantclient \
&& docker-php-ext-install oci8 \
&& docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/usr/local/instantclient \
&& docker-php-ext-install pdo_oci \
&& rm -rf /tmp/pear
从这个映像中,我们构建了部署到Kubernetes集群的特定于应用程序的映像,并且TNS_ADMIN
变量和值已经持久化,没有出现任何问题。
我们最近更改了映像的构建方式(使用Kaniko和GitLab CI,而不是在本地构建),并发现现在将映像部署到Kubernetes群集时(通过Helm)TNS_ADMIN
变量现在缺失(不只是一个空值,而是整个变量)。另一个更改是Oracle组件的安装方式(使用docker-php-extension-installer),因此相关的Dockerfile代码现在看起来如下所示:
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && \
install-php-extensions oci8 pdo_oci
# Oracle client config
ENV TNS_ADMIN=/etc/oracle
COPY php.cli/oracle /etc/oracle
下面是GitLab CI Kaniko相关代码,用于构建特定于应用程序的映像(只有$PHP_TYPE
适用于所讨论的映像):
- |
LOCAL_REPOSITORY=${CI_REGISTRY}/<internal namespace path>/$REPOSITORY
# Build config.json for credentials
echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
/kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/$DOCKER_FILE_PATH/Dockerfile --build-arg PHP_VERSION=$PHP_VERSION --build-arg PHP_TYPE=$PHP_TYPE --build-arg PHPUNIT_VERSION=$PHPUNIT_VERSION --build-arg PHPCS_VERSION=$PHPCS_VERSION --build-arg PHPCSFIXER_VERSION=$PHPCSFIXER_VERSION --destination $LOCAL_REPOSITORY:$PHP_VERSION-$TAG_NAME
考虑到这可能是由于Kaniko的工作方式,或者Oracle安装过程的变化,我们分别提取了基础映像和应用程序映像,并使用bash shell运行它们。当在本地提取时,TNS_ADMIN
变量存在。这表明一旦Helm将其部署到集群,就会发生任何事情。
令人烦恼的是,表面上看,我们所做的任何更改都不应该以这种方式影响映像中环境变量的设置,但这些更改是唯一与问题同时出现的更改。因此,问题似乎是在将映像部署到群集时出现的。* 此过程本身根本没有更改 *。Helm图表没有更改,这表明它不是此问题的一部分;也就是说,当Helm部署使用该映像的图表时,会出现问题。
有没有其他人看到这样的东西,或者有任何想法,在哪里集中我们的搜索答案?
1条答案
按热度按时间mrphzbgm1#
我们遇到的问题可能是许多在Kubernetes中运行应用程序的人所特有的:我们用于Helm部署的映像拉取策略设置为
IfNotPresent
,并且正在使用未设置ENV值的缓存映像(该映像是使用未设置TNS_ADMIN
的Dockerfile构建的)。我们的流程中有许多活动部件,因此进行了多项未显示的更改。我当然受到了这个解释的启发,所以我将提供建议,始终确保您拉出一个新的映像,作为解决Kubernetes/Helm部署问题的第一步。