Is sklearn compatible with Linux-alpine? - python-3.x

I get an error when I try to build an alpine based docker image that includes the sklearn package.
I've tried a few variations of pip installation, different package combinations, and outdated versions of sklearn to see if they are compatible. I've also run the container in -it mode and tried to install the package manually from there. When I remove the sklearn line, the Dockerfile builds and the container runs just fine. Sklearn works in an Ubuntu:latest Dockerfile I've built, but I'm trying to reduce my footprint, so I was hoping to get it to work on alpine...
Here's my Dockerfile code:
FROM alpine:latest
RUN apk upgrade --no-cache \
&& apk update \
&& apk add --no-cache \
musl \
build-base \
python3 \
python3-dev \
postgresql-dev \
bash \
git \
&& pip3 install --no-cache-dir --upgrade pip \
&& pip3 install sklearn \
&& rm -rf /var/cache/* \
&& rm -rf /root/.cache/*
And here's the error I'm getting:
ERROR: Command "/usr/bin/python3.6 /usr/lib/python3.6/site-packages/pip/_vendor/pep517/_in_process.py prepare_metadata_for_build_wheel /tmp/tmpqjsz0004" failed with error code 1 in /tmp/pip-install-xlvbli9u/scipy

Alpine Linux doesn't support PEP 513. I found that something like this works:
RUN apk add --no-cache gcc g++ gfortran lapack-dev libffi-dev libressl-dev musl-dev && \
mkdir scipy && cd scipy && \
wget https://github.com/scipy/scipy/releases/download/v1.3.2/scipy-1.3.2.tar.gz && \
tar -xvf scipy-1.3.2.tar.gz && \
cd scipy-1.3.2 && \
python3 -m pip --no-cache-dir install .

Related

installing PyMuPDF in python 3.8 alpine

I am trying to install PyMuPDF in the official Python 3.8 alpine docker image. The dockerfile is like this:
FROM python:3.8-alpine
RUN apk add --update --no-cache \
gcc g++ \
libc-dev \
python3-dev \
build-base \
cairo-dev \
cairo \
cairo-tools \
jpeg-dev \
zlib-dev \
freetype-dev \
lcms2-dev \
openjpeg-dev \
tiff-dev \
tk-dev \
tcl-dev \
mupdf-dev \
musl-dev \
jbig2dec \
openjpeg-dev \
harfbuzz-dev \
vim bash
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade pip && \
pip install --cache-dir .pip-cache -r requirements.txt && \
rm -rf .pip-cache
The version of PyMuPDF I'm trying to install is 1.20.1
Attempts to build this image is failing with this error:
#10 137.0 × Encountered error while trying to install package.
#10 137.0 ╰─> PyMuPDF
As I understand, a PyMuPDF wheel for Alpine linux is not available. That's why we have to make it from source. Scrolling up a bit in the the terminal, I see this:
#10 124.9 scripts/tesseract/endianness.h:20:2: error: #error "I don't know what architecture this is!"
#10 124.9 20 | #error "I don't know what architecture this is!"
#10 124.9 | ^~~~~
#10 124.9 make: *** [Makefile:133: build/release/source/fitz/tessocr.o] Error 1
So looks like building PyMuPDF fails because tesseract cannot recognize the endianness of this environment. How can I move past this hurdle?
If you have a working example of installing PyMuPDF in this docker image, please let me know. Thanks in advance.
Here is an example with Python 3.10 Alpine. Not 3.8 but I hope this helps.
FROM python:3.10-alpine3.16
ARG PYMUPDF_VERSION=1.20.1
RUN apk update \
&& apk add --update --no-cache \
build-base \
gcc \
jbig2dec \
jpeg-dev \
harfbuzz-dev \
libc-dev \
mupdf-dev \
musl-dev \
openjpeg-dev \
swig \
&& ln -s /usr/lib/libjbig2dec.so.0 /usr/lib/libjbig2dec.so
WORKDIR /tmp
RUN wget https://github.com/pymupdf/PyMuPDF/archive/refs/tags/${PYMUPDF_VERSION}.tar.gz \
&& tar -xzf ${PYMUPDF_VERSION}.tar.gz \
&& rm ${PYMUPDF_VERSION}.tar.gz \
&& cd PyMuPDF-${PYMUPDF_VERSION} \
&& python setup.py build && python setup.py install

How to get rid of cryptography build error?

I am trying to build a dockerfile but the problem is when it trying to build specifically cryptography is not building.
MY Dockerfile
FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
RUN apk update \
# psycopg2 dependencies
&& apk add --virtual build-deps gcc python3-dev musl-dev\
&& apk add postgresql-dev \
&& apk add build-base \
# Pillow dependencies
&& apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev \
# CFFI dependencies
&& apk add libffi-dev py-cffi \
# Translations dependencies
&& apk add gettext \
# https://docs.djangoproject.com/en/dev/ref/django-admin/#dbshell
&& apk add postgresql-client \
# cairo
&& apk add cairo cairo-dev pango-dev gdk-pixbuf-dev poppler-utils
# fonts for weasyprint
RUN mkdir ~/.fonts
COPY ./fonts/* /root/.fonts/
# secret key (should be in docker-secrets, or we need to run minikube locally
RUN mkdir /etc/secrets
COPY secret.readme proxy_rsa_key* /etc/secrets/
# Requirements are installed here to ensure they will be cached.
COPY ./requirements /requirements
RUN pip install -r /requirements/local.txt
COPY ./compose/local/django/entrypoint /entrypoint
RUN sed -i 's/\r//' /entrypoint
RUN chmod +x /entrypoint
COPY ./compose/local/django/start /start
RUN sed -i 's/\r//' /start
RUN chmod +x /start
COPY ./compose/local/django/celery/worker/start /start-celeryworker
RUN sed -i 's/\r//' /start-celeryworker
RUN chmod +x /start-celeryworker
COPY ./compose/local/django/celery/beat/start /start-celerybeat
RUN sed -i 's/\r//' /start-celerybeat
RUN chmod +x /start-celerybeat
COPY ./compose/local/django/celery/flower/start /start-flower
RUN sed -i 's/\r//' /start-flower
RUN chmod +x /start-flower
WORKDIR /app
ENTRYPOINT ["/entrypoint"]
when I try to build my dockerfile it shows:
Building wheel for cryptography (PEP 517): finished with status 'error'
ERROR: Command errored out with exit status 1:
error: Can not find Rust compiler
----------------------------------------
ERROR: Failed building wheel for cryptography
I tried to solve but i couldn't. I am newbie in docker.Please help how to get rid of this problem.
cryptography < 3.5:
You can skip the rust installation and other related dependencies by adding the line below before apk add commands:
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
cryptography >= 3.5: Thanks #riptusk331
After this version rust will be required. Either install a specific version <3.5 or follow cryptography installation instructions. It is stated in the attached link that they are very aggressively explained in the docs.
Since the error is...
error: Can not find Rust compiler
...the solution is to install the rust compiler. You'll also need
cargo, the Rust package manager, and it looks like your Dockerfile
is missing openssl-dev.
The following builds successfully for me:
FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
RUN apk add --update \
build-base \
cairo \
cairo-dev \
cargo \
freetype-dev \
gcc \
gdk-pixbuf-dev \
gettext \
jpeg-dev \
lcms2-dev \
libffi-dev \
musl-dev \
openjpeg-dev \
openssl-dev \
pango-dev \
poppler-utils \
postgresql-client \
postgresql-dev \
py-cffi \
python3-dev \
rust \
tcl-dev \
tiff-dev \
tk-dev \
zlib-dev
RUN pip install cryptography
Note that the above apk add ... command line is largely the same as
what you've got; I've just simplified the multiple apk add ...
statements into a single apk add execution.
pip install -U pip is what all I had to do
Some people might come here (Like I did) looking for a fix just for Python, not necessarily Alpine.
Several options are available, mentioned in the github issue. (only pick one of these)
You can install rust, as another answer mentioned
You can downgrade your cryptography version to 3.4.x
You can upgrade to pip version 19.1.1 or higher, which installs precompiled packages
I faced the same issue and in order to resolve it I tried out the following:
Answer provided by #larsks. RUN apk add cargo openssl-dev helped. But this resulted in a huge image size for me (>1GB). Best practice is to always target the bare-minimum with a small image size. This way, we don't expose ourselves to any external vulnerabilities.
Answer provided by Sabri Özgür, ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1. This worked great!
Based on the comment added by #riptusk331 for the earlier answer, simply ignoring the Rust build may only work for now, as Cryptography 3.5+ will start requiring Rust.
My solution just to be safe was;
...
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
...
RUN pip install cryptography==3.4.6
...
This way, I managed to keep the image size at a considerably lower value while getting the build to pass.
Editing pyvenv.cfg by adding in my .env:
CRYPTOGRAPHY_DONT_BUILD_RUST=1
then doing pip install cryptography, solved my issue.

Docker build for Mattermost, /bin/sh dnf not found

I've got a CentOS 8 install, and I'm trying to use a docker container to run Mattermost to set up a local node for my family to use. I've been searching a lot online, but my google-fu appears to be weak as I can't get answers that address my issue.
I've downloaded docker, and docker compose using the following guide, again tailoring it to Centos - https://docs.mattermost.com/install/prod-docker.htm I've successfully run the "Hello World" container.
I'm using this guide and trying to tailor the Mattermost container install - https://wiki.archlinux.org/index.php/Ma ... ith_Docker
I've edited the ~/mattermost-docker/db/Dockerfile to remove references to apk, and put in yum and then dnf, and tried to execute with SUDO in the script and using SU account to run the script. Latest Dockerfile:
FROM postgres:9.4-alpine
ENV DEFAULT_TIMEZONE UTC
# Install some packages to use WAL
RUN echo "azure<5.0.0" > pip-constraints.txt
RUN dnf install -y \
build-base \
curl \
libc6-compat \
libffi-dev \
linux-headers \
python-dev \
py-pip \
py-cryptography \
pv \
libressl-dev \
&& pip install --upgrade pip \
&& pip --no-cache-dir install -c pip-constraints.txt 'wal-e<1.0.0' envdir \
&& rm -rf /tmp/* /var/tmp/* \
&& dnf clean all
# Add wale script
COPY setup-wale.sh /docker-entrypoint-initdb.d/
#Healthcheck to make sure container is ready
HEALTHCHECK CMD pg_isready -U $POSTGRES_USER -d $POSTGRES_DB || exit 1
# Add and configure entrypoint and command
COPY entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
CMD ["postgres"]
VOLUME ["/var/run/postgresql", "/usr/share/postgresql/", "/var/lib/postgresql/data", "/tmp", "/etc/wal-e.d/env"]
However it still fails on: docker-compose build
Error -
Building db
Step 1/10 : FROM postgres:9.4-alpine
---> 4e66908aa630
Step 2/10 : ENV DEFAULT_TIMEZONE UTC
---> Using cache
---> 03d176f9f783
Step 3/10 : RUN echo "azure<5.0.0" > pip-constraints.txt
---> Using cache
---> 35dbc995f705
Step 4/10 : RUN sudo dnf install -y build-base curl libc6-compat libffi-dev linux-headers python-dev py-pip py-cryptography pv libressl-dev && pip install --upgrade pip && pip --no-cache-dir install -c pip-constraints.txt 'wal-e<1.0.0' envdir && rm -rf /tmp/* /var/tmp/* && dnf clean all
---> Running in 4b89205fdca3
/bin/sh: dnf: not found
ERROR:Service 'db' failed to build : The command '/bin/sh -c sudo dnf install -y build-base curl libc6-compat libffi-dev linux-headers python-dev py-pip py-cryptography pv libressl-dev && pip install --upgrade pip && pip --no-cache-dir install -c pip-constraints.txt 'wal-e<1.0.0' envdir && rm -rf /tmp/* /var/tmp/* && dnf clean all' returned a non-zero code: 127````
Confirmed dnf, and yum are present in /bin and /usr/bin, confirmed /bin/sh -> /bin/bash. I'm not even sure what question I should be asking, so I'd appreciate some assistance in figuring out how I can get this container stood up.
Thanks.

docker build error the folder you are executing pip from can no longer be found

I'm making a Dockerfile to install python38 on centos7 base. Everything works file until pip3 command. Dockerile looks like this.
FROM centos:centos7
RUN RPM_LIST=" \
gcc \
make \
openssl-devel \
bzip2-devel \
libffi-devel" && \
yum install -y $RPM_LIST && \
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz && \
tar xvf Python-3.8.2.tgz && \
cd Python-3.8.2 && \
./configure && \
make && \
make install && \
rm -rf /Python-3.8.2* && \
yum remove -y $RPM_LIST && \
pip3 install retrying
Error is The folder you are executing pip from can no longer be found..
I changed the last line to RUN pip3 install retrying and it started working, but it added an additional 300 MB to my image, which i can't effort.
Any suggestions, what am i missing here or any alternative ways ?
This is how the working Dockerfile looks like
FROM centos:centos7
RUN RPM_LIST=" \
gcc \
make \
openssl-devel \
bzip2-devel \
libffi-devel" && \
yum install -y $RPM_LIST && \
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz && \
tar xvf Python-3.8.2.tgz && \
cd Python-3.8.2 && \
./configure && \
make && \
make install && \
pip3 install retrying && \
yum remove -y $RPM_LIST && \
rm -rf /Python-3.8.2*
for some reason, calling pip3 command from Python-3.8.2 folder was not working. Here i moved the rm command after the pip3 call. Hope this information helps someone.
I just ran into The folder you are executing pip from can no longer be found.
My Dockerfile has not changed in months. It does not install pip.
It does force remove and make a folder just prior to running a pip install on a requirements file -- into which pip is supposed to install things.
The fix? I simply ran it again and it worked. Hmm...
So I am posting this here in case there is some mysterious timing issue about which folks wish to collect clues.
--- edit add --
Also, yesterday I ran into this docker issue, which required turning off docker's experimental gRPC feature in its preferences. Perhaps it could be related somehow?
Why does Serverless produce an Invalid Cross-device link Error when trying to package or deploy?

How to install aws-cli on alpine?

I'm installing aws-cli on a docker swarm manager node running alpine (Linux 0317632a4ad9 4.9.59-moby #1 SMP Thu Mar 1 20:54:00 UTC 2018 x86_64 Linux). The aws-cli package for Alpine is currently listed in the community repo on the edge branch (1.18.55.r0). I modified /etc/apk/repositories to target this repo.
The install blew up looking for py3-urllib3, but I got around that and finally got a clean install with no errors, as below:
~ $ sudo apk add aws-cli#edge-comm
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
ERROR: unsatisfiable constraints:
py3-urllib3-1.25.9-r0:
masked in: #edge
satisfies: py3-botocore-1.16.12-r0[py3-urllib3<1.26]
~ $ sudo apk add py3-urllib3#edge aws-cli#edge-comm
(1/23) Installing groff (1.22.3-r1)
(2/23) Installing py3-six (1.10.0-r6)
(3/23) Installing py3-dateutil (2.6.0-r1)
(4/23) Installing libpng (1.6.37-r0)
(5/23) Installing freetype (2.7.1-r2)
(6/23) Installing libjpeg-turbo (1.5.3-r2)
(7/23) Installing lcms2 (2.8-r1)
(8/23) Installing openjpeg (2.3.0-r2)
(9/23) Installing tiff (4.0.10-r0)
(10/23) Installing libwebp (0.6.0-r0)
(11/23) Installing py3-pillow (4.1.0-r0)
(12/23) Installing py3-roman (2.0.0-r2)
(13/23) Installing py3-docutils (0.13.1-r0)
(14/23) Installing py3-jmespath#edge-comm (0.9.5-r0)
(15/23) Installing py3-urllib3#edge (1.25.9-r0)
(16/23) Installing py3-botocore#edge-comm (1.16.12-r0)
(17/23) Installing py3-s3transfer#edge-comm (0.3.3-r0)
(18/23) Installing py3-colorama#edge-comm (0.4.3-r0)
(19/23) Installing yaml (0.1.7-r0)
(20/23) Installing py3-yaml (3.12-r1)
(21/23) Installing py3-asn1 (0.2.3-r0)
(22/23) Installing py3-rsa (3.4.2-r1)
(23/23) Installing aws-cli#edge-comm (1.18.55-r0)
Executing busybox-1.26.2-r11.trigger
OK: 576 MiB in 81 packages
The binary is created at /usr/bin/aws, but crashes looking for an awscli module:
~ $ aws
Traceback (most recent call last):
File "/usr/bin/aws", line 19, in <module>
import awscli.clidriver
ModuleNotFoundError: No module named 'awscli'
Thanks!
For anybody who googles this,
I've been using the image node:12.16.1-alpine.
RUN apk add --no-cache \
python3 \
py3-pip \
&& pip3 install --upgrade pip \
&& pip3 install --no-cache-dir \
awscli \
&& rm -rf /var/cache/apk/*
RUN aws --version # Just to make sure its installed alright
# Should output aws-cli/1.18.69 etc.
Worked fine for me.
NOTE: apk --no-cache and pip3 --no-cache-dir are used to keep the Docker image lean by not retaining package cache.
We have aws-cli Alpine package now. So you can just run
apk add --no-cache aws-cli
to expand and update upon #Rose (4317383) 's answer ( and get awscli version 2 ):
the regular pip3 packet ( pip3 install awscliv2 && awscliv2 -i ) presents the following errors due to musl / non-glibc alpine implementations:
Error relocating /root/.awscliv2/binaries/aws: __strcat_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __snprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __vfprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strdup: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __stpcpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __vsnprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strncpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strcpy_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __fprintf_chk: symbol not found
Error relocating /root/.awscliv2/binaries/aws: __strncat_chk: symbol not found
in doubt GLIBC is necessary , but if you are willing to invest ~100MB of space or you really need v2 , the following snippet would help
RUN apk --no-cache add \
binutils \
curl \
&& GLIBC_VER=$(curl -s https://api.github.com/repos/sgerrand/alpine-pkg-glibc/releases/latest | grep tag_name | cut -d : -f 2,3 | tr -d \",' ') \
&& curl -sL https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \
&& curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk \
&& curl -sLO https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk \
&& apk add --no-cache \
glibc-${GLIBC_VER}.apk \
glibc-bin-${GLIBC_VER}.apk \
&& curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip \
&& unzip awscliv2.zip \
&& aws/install \
&& rm -rf \
awscliv2.zip \
aws \
/usr/local/aws-cli/v2/*/dist/aws_completer \
/usr/local/aws-cli/v2/*/dist/awscli/data/ac.index \
/usr/local/aws-cli/v2/*/dist/awscli/examples \
&& apk --no-cache del \
binutils \
curl \
&& rm glibc-${GLIBC_VER}.apk \
&& rm glibc-bin-${GLIBC_VER}.apk \
&& rm -rf /var/cache/apk/*
RUN awsv2 --version # Just to make sure its installed alright
if your scripts do not break with awscliv2 named as awscli, you might add :
RUN ln -s $(which awscliv2) /usr/bin/aws
RUN apk update \
&& apk --no-cache add curl \
&& apk --no-cache add unzip \
&& curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
&& unzip awscliv2.zip \
&& ./aws/install
I've been using the image node:14-alpine
apk add --update --no-cache curl ca-certificates \
&& curl -sL -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
&& curl -sL -o glibc-2.28-r0.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk \
&& apk add glibc-2.28-r0.apk \
&& curl -sL -o glibc-bin-2.28-r0.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-bin-2.28-r0.apk \
&& apk add glibc-bin-2.28-r0.apk \
&& curl -sL -o awscliv2.zip https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.0.30.zip \
&& unzip awscliv2.zip \
&& ./aws/install \
&& rm -Rf aws/ awscliv2.zip glibc-2.28-r0.apk glibc-bin-2.28-r0.apk \
&& aws --version
Yesterday, I spent quite some time to figure out how to build a slim aws-cli v2 image for ci pipelines (hence autocomplete and examples are removed) that does not suffer from the symbol not found problem.
After the glibc 2.35-r0 packages are installed, the symlink /lib64/ld-linux-x86-64.so.2 still points to the musl version of the library and not the glibc version. In glibc 2.34-r0 the symlink was replaced correctly, so I assume it is a bug in 2.35-r0.
This is my multi-staged Dockerfile to build an aws-cli 2.7.33 image:
FROM alpine:3.16.2 as base
ENV GLIBC_VER=2.35-r0
RUN set euo pipefail; \
apk --no-cache add curl; \
curl --silent --location https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub --output /etc/apk/keys/sgerrand.rsa.pub; \
curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-${GLIBC_VER}.apk; \
curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk; \
curl --silent --location --remote-name https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VER}/glibc-i18n-${GLIBC_VER}.apk; \
apk --no-cache add \
glibc-${GLIBC_VER}.apk \
glibc-bin-${GLIBC_VER}.apk \
glibc-i18n-${GLIBC_VER}.apk; \
# optional: add if needed, will add ~10mb to the final image
#/usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8; \
# replace symlink to point to glibc version instead of musl version
ln -sf /usr/glibc-compat/lib/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2; \
apk --no-cache del curl glibc-i18n; \
rm -rf \
/var/cache/apk/* \
/etc/apk/keys/sgerrand.rsa.pub \
glibc*${GLIBC_VER}.apk
FROM base as builder
ARG AWS_CLI_VERSION=2.7.33
RUN set euo pipefail; \
apk --no-cache add curl; \
curl --silent --location --remote-name https://awscli.amazonaws.com/awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip; \
unzip -q awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip; \
aws/install; \
aws --version; \
rm -rf \
awscli-exe-linux-x86_64-${AWS_CLI_VERSION}.zip \
aws \
/usr/local/aws-cli/v2/*/bin/aws_completer \
/usr/local/aws-cli/v2/*/dist/aws_completer \
/usr/local/aws-cli/v2/*/dist/awscli/data/ac.index \
/usr/local/aws-cli/v2/*/dist/awscli/examples; \
apk --no-cache del \
binutils \
curl; \
rm -rf /var/cache/apk/*
FROM base
COPY --from=builder /usr/local/aws-cli/ /usr/local/aws-cli/
RUN ln -sf /usr/local/aws-cli/v2/current/bin/aws /usr/local/bin/aws
ENTRYPOINT ["aws"]
Solution
Here's what you guys are looking for.
https://github.com/robertd/alpine-aws-cdk/blob/master/Dockerfile.v2
It works with Alpine and AWS CLI v2.
Credits for "Robert Djurasaj"
use and add apk
'''
image:
name: rxmllc/alpine-aws-cli
before_script:
- apk --no-cache add curl
'''
please refer https://hub.docker.com/r/rxmllc/alpine-aws-cli
If you are using alpine latest image then this always works for me
- apt update && apt install curl zip jq -y
# install aws cli
- curl -sL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip && unzip -q awscliv2.zip && aws/install && rm -rf awscliv2.zip aws /usr/local/aws-cli/v2/*/dist/aws_completer /usr/local/aws-cli/v2/*/dist/awscli/data/ac.index /usr/local/aws-cli/v2/*/dist/awscli/examples
# verify aws cli installation
- aws --version
you can use in my opinion alpine does not support aws cli V2
RUN apk add --no-cache \
python3 \
py3-pip \
&& pip3 install --upgrade pip \
&& pip3 install --no-cache-dir \
awscli \
&& rm -rf /var/cache/apk/*
The method published on the official awscliv2 install page for general Linux works fine on Alpine.
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip ./awscliv2.zip && \
rm -f ./awscliv2.zip && \
./aws/install -i /usr/local/aws -b /bin && \
rm -rf ./aws
Just clean up your zip and leftover install files.
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
There is an official AWS-CLI image on docker hub published by Amazon, although it uses AmazonLinux2 and not Alpine. I will recommend you use it though.
Reference:
https://hub.docker.com/r/amazon/aws-cli
It's DockerFile:
https://github.com/aws/aws-cli/blob/v2/docker/Dockerfile
FROM amazonlinux:2 as installer
COPY awscli-exe-linux-x86_64.zip .
RUN yum update -y \
&& yum install -y unzip \
&& unzip awscli-exe-linux-x86_64.zip \
# The --bin-dir is specified so that we can copy the
# entire bin directory from the installer stage into
# into /usr/local/bin of the final stage without
# accidentally copying over any other executables that
# may be present in /usr/local/bin of the installer stage.
&& ./aws/install --bin-dir /aws-cli-bin/
FROM amazonlinux:2
RUN yum update -y \
&& yum install -y less groff \
&& yum clean all
COPY --from=installer /usr/local/aws-cli/ /usr/local/aws-cli/
COPY --from=installer /aws-cli-bin/ /usr/local/bin/
WORKDIR /aws
ENTRYPOINT ["/usr/local/bin/aws"]

Resources