使用不兼容的Alpine发行版时能否跳过GLIBCXX检查?
问题:Alpine + PHP7.2容器在VS Code Remote Container中启动失败(GLIBCXX错误)
- 基于
php:7.2-fpm-alpine3.12构建的工作区,docker compose up -d可正常部署,但通过VS Code Remote Container打开时触发GLIBCXX相关错误,容器直接关闭 - 问题关联VS Code官方仓库的
check-requirements-linux.sh脚本,与Alpine的musl libc兼容性冲突 - 已知临时方案:降级VS Code到v1.8.5,但属于临时 workaround,不便长期使用
- 硬性约束:必须使用Alpine系列镜像(如
php:7.2-<ALPINE DISTRO>)
可行解决方案
方案1:覆盖检查脚本(推荐)
在Dockerfile中添加步骤,替换Remote Container会执行的检查脚本,直接返回成功:
# 覆盖VS Code Remote Container的系统检查脚本,跳过GLIBCXX版本校验 RUN mkdir -p /usr/local/bin && \ echo '#!/bin/sh' > /usr/local/bin/check-requirements-linux.sh && \ echo 'exit 0' >> /usr/local/bin/check-requirements-linux.sh && \ chmod +x /usr/local/bin/check-requirements-linux.sh
Remote Container插件会优先读取/usr/local/bin下的脚本,用这个空脚本替代原检查逻辑,直接通过校验。
方案2:安装兼容的libstdc++库
在Dockerfile的apk安装步骤中添加libstdc++包,补充GLIBCXX相关依赖:
# 在apk add --no-cache的列表中添加libstdc++ apk add --update --no-cache \ autoconf bash g++ coreutils gcc make git openssh-client \ libressl-dev patch pkgconfig subversion tini \ gettext-dev bzip2-dev libxslt-dev mongodb-tools msgpack-c unzip zip \ libstdc++ # 添加这一行
注意:不要将libstdc++放到.build-deps虚拟包中,确保最终镜像保留该依赖。
方案3:通过环境变量跳过检查
在.devcontainer/devcontainer.json中添加环境变量,告知插件跳过系统依赖检查:
{ "containerEnv": { "REMOTE_CONTAINERS_SKIP_REQUIREMENTS_CHECK": "true" } }
修改后的完整Dockerfile(整合方案1)
#USE this Dockerfile if you want to test the image ARG PHP_VERSION=7.2 ARG PHP_IMAGE=php:${PHP_VERSION}-fpm-alpine3.12 ARG PHP_PHALCON_VERSION=3.4.x ARG PHP_COMPOSER_VERSION=2.1.8 ARG COMPOSER_IMAGE=composer:${PHP_COMPOSER_VERSION} ARG AMQP_VERSION=amqp-1.10.2 ARG PHP_XDEBUG_VERSION=xdebug-3.1.0 FROM ${PHP_IMAGE} AS php ARG AMQP_VERSION ARG PHP_PHALCON_VERSION ARG PHP_XDEBUG_VERSION ENV PHP_ZLIB_DIR=/usr/ # Fix timezone issue ENV TZ=Europe/Lisbon RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \ ; \ apk upgrade --update-cache --available && \ apk add --update --no-cache \ autoconf bash g++ coreutils gcc make git openssh-client \ libressl-dev patch pkgconfig subversion tini \ #dep for php ext: gettext gettext-dev \ #dep for php ext: bz2 bzip2-dev \ #dep for php ext: xsl + soap libxslt-dev \ #dep for php ext: mongodb mongodb-tools \ #dep for php ext: msgpack msgpack-c \ #dep for php ext: zip unzip zip \ ; \ apk add --no-cache --virtual .build-deps \ #dep for php ext: intl icu-dev \ ; \ docker-php-source extract \ && docker-php-ext-install \ bcmath \ bz2 \ calendar \ exif \ gettext \ intl \ pdo_mysql \ soap \ sockets \ xsl \ zip \ ; \ pecl channel-update pecl.php.net \ && pecl install igbinary \ && pecl install msgpack \ && pecl install mongodb-1.10.0 \ && echo "php_ini = /usr/local/etc/php/php.ini" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ && pecl install ${PHP_XDEBUG_VERSION} \ #dep for php ext: yaml && apk add --update --no-cache yaml-dev \ && pecl install yaml \ #dep for php ext: memcached && apk add --update --no-cache libmemcached-dev zlib-dev libpng-dev \ && pecl install memcached --with-zlib-dir=$PHP_ZLIB_DIR \ #dep for php ext: rabbitmq / amqp && apk add --update --no-cache rabbitmq-c-dev \ && printf "\n" | pecl install ${AMQP_VERSION} \ && printf "\n" | pecl install redis-5.3.2 \ && docker-php-ext-enable igbinary msgpack mongodb xdebug yaml memcached redis \ # enabling amqp ext this way avoids coflicts loading dependecies (sockets) && echo "extension=amqp" > /usr/local/etc/php/conf.d/40-amqp.ini \ && docker-php-source delete \ && apk del --purge .build-deps \ && mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" ## Composer ARG COMPOSER_IMAGE FROM ${COMPOSER_IMAGE} AS composer FROM php AS phalcon ARG PHP_PHALCON_VERSION #phalcon RUN cd ~ && git clone --depth=1 -b ${PHP_PHALCON_VERSION} git://github.com/phalcon/cphalcon.git \ && cd ~/cphalcon/build \ && ./install \ && echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/50-phalcon.ini \ && rm -rf ~/cphalcon \ ; \ # 覆盖VS Code Remote Container的系统检查脚本,跳过GLIBCXX版本校验 mkdir -p /usr/local/bin && \ echo '#!/bin/sh' > /usr/local/bin/check-requirements-linux.sh && \ echo 'exit 0' >> /usr/local/bin/check-requirements-linux.sh && \ chmod +x /usr/local/bin/check-requirements-linux.sh \ ; \ # clean up apk del autoconf bash check-dev cyrus-sasl-dev g++ gcc \ imagemagick-dev libc-dev libssh2-dev libsodium-dev \ m4 make musl-dev openssl-dev perl pkgconfig \ tzdata \ && rm -rf /var/cache/apk/* && rm -rf /tmp/* # RUN php -r "echo Phalcon\Version::get();" COPY --from=composer /usr/bin/composer /usr/bin/composer WORKDIR /app
内容的提问来源于stack exchange,提问作者sirvictahh
相关产品推荐
相关产品推荐

