Polskie locale w obrazie Alpine

0

Mamy obraz zbudowany na bazie Linux Alpine (https://hub.docker.com/repository/docker/4programmers/php/general). Za nic w świecie nie da się uruchomić na nim polskiego locale. Niby jest zainstalowane, ale nie działa.

php -r "setlocale(LC_ALL, 'pl_PL.UTF-8');echo strftime('%A');"

Zwraca Wednesday.

Można sprawdzić również w Pythonie: apk add python3, a następnie w Pythonie python3:

>>> import time, locale
>>> locale.setlocale(locale.LC_TIME, "pl_PL.UTF-8")
'pl_PL.UTF-8'
>>> print(time.strftime("%a, %d %b %Y %H:%M:%S"))
Wed, 16 Dec 2020 12:49:50
>>> locale.setlocale(locale.LC_TIME, "pl_PL")
'pl_PL'
>>> print(time.strftime("%a, %d %b %Y %H:%M:%S"))
Wed, 16 Dec 2020 12:49:57

Dockerfile:

FROM php:7.4-fpm-alpine

LABEL maintainer="4programmers.net <[email protected]>"

WORKDIR /var/www

RUN apk update && apk add --no-cache \
    curl \
    bash \
    openssh-client \
    libmcrypt-dev \
    libpq \
    libzip-dev \
    freetype-dev \
    libcurl \
    libzip-dev \
    bzip2-dev \
    libjpeg-turbo-dev \
    postgresql-dev \
    freetype-dev \
    libpng-dev \
    libc-dev \
    linux-headers \
    zlib-dev \
    gnupg \
    libxml2-dev \
    zip \
    make \
    autoconf \
    gcc \
    git \
    oniguruma-dev

RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) pgsql gd soap pdo_pgsql mbstring zip opcache iconv

RUN pecl install xdebug

RUN curl --insecure https://getcomposer.org/composer-stable.phar -o /usr/bin/composer && chmod +x /usr/bin/composer

RUN apk add tzdata
RUN cp /usr/share/zoneinfo/Europe/Warsaw /etc/localtime
RUN echo "Europe/Warsaw" >  /etc/timezone

RUN apk add yarn

ARG UID=1000
ARG GID=1000

ENV php_conf /usr/local/etc/php-fpm.conf
ENV fpm_conf /usr/local/etc/php-fpm.d/www.conf
ENV php_vars /usr/local/etc/php/conf.d/docker-vars.ini

RUN addgroup -g ${GID} -S nginx
RUN adduser -u ${UID} -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx

RUN echo "cgi.fix_pathinfo=0" > ${php_vars} &&\
    echo "upload_max_filesize = 50M"  >> ${php_vars} &&\
    echo "post_max_size = 50M"  >> ${php_vars} &&\
    echo "variables_order = \"EGPCS\""  >> ${php_vars} && \
    echo "memory_limit = 512M"  >> ${php_vars} && \
    echo "opcache.preload = /var/www/preload.php" >> ${php_vars} && \
    echo "opcache.preload_user = nginx" >> ${php_vars} && \
    sed -i \
        -e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \
        -e "s/pm.max_children = 5/pm.max_children = 64/g" \
        -e "s/pm.start_servers = 2/pm.start_servers = 10/g" \
        -e "s/pm.min_spare_servers = 1/pm.min_spare_servers = 4/g" \
        -e "s/pm.max_spare_servers = 3/pm.max_spare_servers = 16/g" \
        -e "s/;pm.max_requests = 500/pm.max_requests = 500/g" \
        -e "s/user = www-data/user = nginx/g" \
        -e "s/group = www-data/group = nginx/g" \
        -e "s/;listen.mode = 0660/listen.mode = 0666/g" \
        -e "s/;listen.owner = www-data/listen.owner = nginx/g" \
        -e "s/;listen.group = www-data/listen.group = nginx/g" \
        -e "s/^;clear_env = no$/clear_env = no/" \
        ${fpm_conf}

RUN apk --no-cache add ca-certificates wget && \
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-2.25-r0.apk && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-bin-2.25-r0.apk && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-i18n-2.25-r0.apk && \
    apk add glibc-bin-2.25-r0.apk glibc-i18n-2.25-r0.apk glibc-2.25-r0.apk

RUN /usr/glibc-compat/bin/localedef -i pl_PL -f UTF-8 pl_PL.UTF-8

ENV LANG=pl_PL.UTF-8 \
    LANGUAGE=pl_PL.UTF-8

COPY ./docker/php/cron /etc/crontabs/root

ADD ./docker/php/xdebug.sh /xdebug.sh
RUN chmod 755 /xdebug.sh

CMD ["/xdebug.sh"]
0

https://stackoverflow.com/a/53820235

Ustaw LC_ALL w Dockerfile, może pomoże. Miałem kiedyś coś podobnego z openjdk.

0

@0xmarcin:

bash-5.0# export LC_ALL=pl_PL.UTF-8
bash-5.0# php -r "setlocale(LC_ALL, 'pl_PL.UTF-8');echo strftime('%A');"
Thursday

:( Dodam, że na obrazie Ubuntu locale działa dobrze, tyle, że rozmiar wówczas nie jest już tak mały jak na alpine ;p

@TurkucPodjadek zobacz na Dockerfile, który wkleiłem. Jest tam kod z tego gista którego podałeś ;)

1

Podobno jakaś biblioteka libc nie obsługuje jeszcze wszystkiego.
https://github.com/gliderlabs/docker-alpine/issues/144

0

@Adam Boduch: ok, nie zauważyłem. Generalnie mogę zatem odradzić musla (a tym samym alpine), bo wprowadza nowy subset problemów (np. w Go). W 2020 już nie jest konieczne by tak oszczędzać MB na obrazkach, osobiście używałbym "generycznych" oficjalnych obrazków od normalnych dystrybucji, typu Ubuntu, które gwarantują brak takich niespodzianek.

2

@Adam Boduch: Osobiście ja odradzam korzystanie z Alpine. Zostawiam też jeden z powodów:
https://blog.aquasec.com/cve-2019-5021-alpine-docker-image-vulnerability

Skanery obrazów nie radzą sobie z Alpinem (poza Trivy) + było sporo różnego rodzaju problemów z Alpinem. Zebrałem je tutaj: https://szkoladockera.pl/distroless-docker-images-vs-alpine-linux/

2

Użyj Debianowego image a nie się bawić z Alpine. Łatwiej będzie i powinno być bezpieczniej.

0

Kto stoi za Alpine Linuxem?

0

@WeiXiao: z mojego śledztwa wynika, że dwie osoby wystarczą do przepchnięcia PR.
https://github.com/gliderlabs/docker-alpine/pull/503

1

Spróbujemy z obrazem Ubuntu w takim razie. Dam znać jak się zmienił rozmiar obrazu (obecnie 500 MB) oraz czas builda.

2

Rozmiar wzrósł jedynie o 160 MB więc nie jest źle :) A locale działa.

0

@Adam Boduch: - i właśnie to jest to. Stosując obrazy Alpine, oszczędzamy kilkadziesiąt (max kilkaset) megabajtów kosztem bezpieczeństwa, wydajności i różnych problemów....

0

@Adam Boduch: Rzecz pierwsza: nowy moduł = nowy import; po drugie to PPM > Run code kończy się :: Screenshot 2020-12-28 at 15.29.10.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1