我正在尝试将我们的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.
您需要将gettext
添加到dockerfile。你可以使用:RUN apk add gettext
来添加它。而阿尔卑斯山的包裹链接:https://pkgs.alpinelinux.org/package/edge/main/x86/gettext
这是我在项目中使用的apline3.8的Dockerfile,它适用于makemessages
和compilemessages
。
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
我知道这个答案已经过时了,但希望我的回答能有所帮助。
您可以在开头创建--virtual packages并安装它们。这对你的容器来说很棒,因为它保持小而干净,但问题在这里
&& 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
但这意味着你的容器会更大。