Creo que un buen punto de partida será un Dockerfile, en el que comienza desde una imagen de Ubuntu y luego instala las dependencias deseadas (samtools, bwa) y también los paquetes de python (ubicados en un require.txt)
pip freeze > requirements.txt
para tener los paquetes de python deseados (numpy, tqdm, etc.)-
cree un Dockerfile (que se encuentra en el mismo directorio que requirements.txt), por ejemplo:
FROM ubuntu:16.04 RUN apt-get update && \ apt-get upgrade -y && \ apt-get install -y python && \ apt-get install -y wget \ curl \ bc \ unzip \ less \ bedtools \ samtools \ openjdk-8-jdk \ tabix \ bwa\ python-pip\ software-properties-common && \ apt-get -y clean && \ apt-get -y autoclean && \ apt-get -y autoremove RUN mkdir -p /usr/src/app WORKDIR /usr/srv/app COPY . /usr/srv/app RUN pip install -r requirements.txt CMD ["/bin/bash"]
-
construye tu imagen acoplable
docker built --tag repository/imagename .
(DOT es el directorio actual) - imagen de inicio
docker run -dti --name test repository/imagename
- ingrese en el contenedor para comenzar a trabajar
docker attach test
- como puede ver, lo probé y dentro del contenedor tengo todas las herramientas y paquetes deseados
-
Si desea agregar nuevas herramientas, simplemente agréguelas en el Dockerfile y si desea agregar paquetes de python, simplemente expanda el archivo requirements.txt.
-
Si tiene un script de python que hace algo y necesita incluirlo en el contenedor de Docker, simplemente colóquelo en el mismo directorio con el Dockerfile y los requisitos.txt y actualice el Dockerfile (para tener un contenedor que inicie su script de python ), más precisamente en el Dockerfile la última línea será
CMD [ "python", "./my_script.py" ]
No iría tan lejos como para instalar software en alguna computadora/servidor porque podría dañar otro software que se ejecuta en ese sistema. En su lugar, crearía un paquete deb y establecería dependencias sobre qué software debe instalarse para guiar al usuario a través de la instalación.
El directorio deb
contiene scripts/binarios finales para el paquete. source
tiene su código python.
$ cd $HOME/path/to/some/directory
$ mkdir -p ./deb/DEBIAN ./source
$ touch ./Makefile ./source/Makefile ./deb/DEBIAN/{control,preinst} ./source/hello-world.py
$ chmod +x ./deb/DEBIAN/preinst
A continuación, he agregado el contenido de cada archivo. Debería poder implementarlo según sus necesidades.
./Makefile :Este archivo es responsable de generar la fuente y el deb.
PACKAGE := hello-world
DEB_DIR := deb
DEB_FILE := $(PACKAGE).deb
SOURCE_DIR := source
SOURCE_IN := $(SOURCE_DIR)/$(PACKAGE).py
SOURCE_OUT := $(DEB_DIR)/usr/bin/
.PHONY: all clean
all:
@make -C $(SOURCE_DIR) CROSS_COMPILE=$(CROSS_COMPILE)
@mkdir -p $(SOURCE_OUT)
@cp -r $(SOURCE_IN) $(SOURCE_OUT)
@chmod -R a-s $(DEB_DIR)
@dpkg-deb --build $(DEB_DIR) $(DEB_FILE)
clean:
@rm -rf $(DEB_FILE) $(SOURCE_OUT)
@make -C $(SOURCE_DIR) clean
./deb/DEBIAN/control :El archivo de control para el administrador de paquetes de Debian.
Package: hello-world
Version: 1
Section: misc
Priority: optional
Architecture: all
Depends: libc6 (>= 2.24), python (>=2.7.13), virtualenv (>=1.11.6)
Maintainer: Your name <[email protected]>
Description: This is a deb package to install an application
./deb/DEBIAN/preinst :El archivo en el que puede instalar paquetes de python. Se ejecuta antes de la instalación de hello-world.py
. Una vez más, asegúrese de no solo (re)instalar/actualizar una biblioteca. Podría causar problemas de incompatibilidad en otro software.
#! /bin/bash
virtualenv -p /usr/bin/python3 venv/
source venv/bin/activate
pip install -r ./requirements.txt
./fuente/Makefile :Un archivo que usé para probar esta configuración.
MYFILE=hello-world.py
all:
@echo "#!/usr/bin/python\n\
print('Hello world!')" > $(MYFILE)
@chmod +x $(MYFILE)
clean:
@rm $(MYFILE)
dpkg
.
dpkg -i hello-world.deb # for installation
dpkg -r hello-world # for removal
Una buena característica es que no necesita preocuparse por la versión de su software, ya que se hace en el control
expediente. Debian tiene un tutorial bastante bueno si está interesado en leer más.
EDITAR:
Añadido virtualenv
al ejemplo Los paquetes de Python deben instalarse en un entorno virtual en lugar de globalmente.