У нас есть код Python, который делает следующее внутри контейнера докеров.
import boto3
import tarfile
s3 = boto3.client('s3')
s3.download_file("dev-bucket", "test/model.tar.gz", "/opt/ml/model/model.tar.gz")
tar = tarfile.open("/opt/ml/model/model.tar.gz", 'r:gz')
tar.extractall(path="/opt/ml/model")
Однако при извлечении задание завершается с ошибкой OSError: [Errno 30] Файловая система только для чтения. Полная трассировка стека:
Traceback (последний последний вызов):
> File "inference.py", line 6
> tar.extractall(path="/opt/ml/model") File "/opt/conda/lib/python3.7/tarfile.py", line 2002, in extractall
> numeric_owner=numeric_owner) File "/opt/conda/lib/python3.7/tarfile.py", line 2044, in extract
> numeric_owner=numeric_owner) File "/opt/conda/lib/python3.7/tarfile.py", line 2114, in _extract_member
> self.makefile(tarinfo, targetpath) File "/opt/conda/lib/python3.7/tarfile.py", line 2163, in makefile
> copyfileobj(source, target, tarinfo.size, ReadError, bufsize) File "/opt/conda/lib/python3.7/tarfile.py", line 250, in copyfileobj
> dst.write(buf) OSError: [Errno 30] Read-only file system
Докерфайл выглядит следующим образом:
FROM continuumio/miniconda3
# use python3.7
RUN /opt/conda/bin/conda install python=3.7
# Update conda
RUN /opt/conda/bin/conda update -n base conda
# Install build-essential
RUN apt-get update && apt-get install -y build-essential \
wget \
nginx \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
RUN conda install -y pandas==0.25.1 scikit-learn==0.21.2 s3fs==0.4.2
RUN pip install pyarrow==1.0.0 mxnet joblib==0.13.2 boto3
CMD [ "/bin/bash" ]
ENV PYTHONUNBUFFERED=TRUE
ENV PYTHONDONTWRITEBYTECODE=TRUE
ENV PATH="/opt/program:${PATH}"
RUN mkdir -p /opt/ml/model
RUN chmod -R +w /opt/ml/model
RUN mkdir -p /opt/ml/input/data
# Set up the program in the image
COPY helloworld /opt/program
WORKDIR /opt/program