【问题标题】:Django - Cannot compilemessages in Alpine?Django - 无法在 Alpine 中编译消息?
【发布时间】:2018-08-27 04:48:12
【问题描述】:

我正在尝试将我们的 docker 镜像迁移到基于 alpine 的镜像,但我遇到了一个问题,即在构建镜像期间我无法编译消息。

FROM python:3.6-alpine
ENV PYTHONUNBUFFERED 1

# Creating working directory
RUN mkdir /code
WORKDIR /code

# Copying requirements
COPY ./myproject/ .

RUN apk add --no-cache --virtual .build-deps \
ca-certificates gcc postgresql-dev linux-headers musl-dev \
libffi-dev jpeg-dev zlib-dev \
&& pip install -r requirements.txt \
&& find /usr/local \
    \( -type d -a -name test -o -name tests \) \
    -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
    -exec rm -rf '{}' + \
&& runDeps="$( \
    scanelf --needed --nobanner --recursive /usr/local \
            | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
            | sort -u \
            | xargs -r apk info --installed \
            | sort -u \
)" \
&& apk add --virtual .rundeps $runDeps \
&& apk del .build-deps

RUN python manage.py compilemessages

我遇到的唯一问题是编译消息的步骤。这里的错误

CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.

【问题讨论】:

    标签: django docker translation alpine


    【解决方案1】:

    您需要将gettext 添加到 dockerfile。您可以使用:RUN apk add gettext 添加它。还有 Alpine 包链接:https://pkgs.alpinelinux.org/package/edge/main/x86/gettext

    【讨论】:

    • 嘿,谢谢你的回答,我试过了,但错误仍然存​​在。
    • 你好,gcc、python dev等安装了吗?
    • 是的,我已经添加了,你可以在我的示例 dockerfile 中看到。
    • 那样的话,我真的一头雾水。对不起
    • 最后一件事,尝试添加“gettext-dev”
    【解决方案2】:

    这是我在项目中使用的 apline3.8 的 Dockerfile,它适用于 makemessagescompilemessages

    FROM python:3.6-alpine3.8
    
    # postgresql-client is required by psql
    # postgresql-dev musl-dev gcc are required by psycopg
    # NOTE: there is py3-psycopg2
    # linux-headers is required by uwsgi
    # gettext-dev is required by ./manage.py makemessages
    
    # TODO: optimize installation by using --virtual
    RUN apk update && apk upgrade \
        && apk add postgresql-client \
            postgresql-dev \
            musl-dev \
            gcc \
            linux-headers \
            gettext-dev \
        && pip install pipenv
    
    ENV PYTHONUNBUFFERED=1 \
        PYTHONIOENCODING=UTF-8
    
    COPY docker/backend/docker-entrypoint.sh /
    ENTRYPOINT ["/docker-entrypoint.sh"]
    
    WORKDIR /project/backend
    
    COPY backend/Pipfile backend/Pipfile.lock /project/backend/
    
    # TODO: use virtualenv?
    RUN pipenv install --system --ignore-pipfile --dev
    

    【讨论】:

      【解决方案3】:

      我知道这个答案很旧,但希望我的答案会有所帮助。

      您在开始时创建 --virtual 包并安装它们。它非常适合您的容器,因为它既小又干净,但是 问题来了

      && apk del .build-deps
      

      使用此命令可以删除所有虚拟包。如果gettext-dev在这里

      RUN apk add --no-cache --virtual .build-deps \
      ca-certificates gcc postgresql-dev linux-headers musl-dev \
      libffi-dev jpeg-dev zlib-dev gettext-dev\
      

      它也被删除。 因此,如果您希望您的包留在容器中,您需要在安装主包后添加它。

      例如

      FROM python:3.6-alpine
      ENV PYTHONUNBUFFERED 1
      
      # Creating working directory
      RUN mkdir /code
      WORKDIR /code
      
      # Copying requirements
      COPY ./myproject/ .
      
      RUN apk add --no-cache --virtual .build-deps \
      ca-certificates gcc postgresql-dev linux-headers musl-dev \
      libffi-dev jpeg-dev zlib-dev \
      && pip install -r requirements.txt \
      && find /usr/local \
          \( -type d -a -name test -o -name tests \) \
          -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) \
          -exec rm -rf '{}' + \
      && runDeps="$( \
          scanelf --needed --nobanner --recursive /usr/local \
                  | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
                  | sort -u \
                  | xargs -r apk info --installed \
                  | sort -u \
      )" \
      && apk add --virtual .rundeps $runDeps \
      && apk del .build-deps
      
      RUN apk add gettext-dev
      
      RUN python manage.py compilemessages
      

      或者你可以删除这一行

      && apk del .build-deps
      

      但这意味着你的容器会更大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 2019-07-14
        • 2019-12-26
        相关资源
        最近更新 更多