Source code for chap_core.rbased_docker
import tempfile
import docker
import os
[docs]
def create_image(r_packages, image_name="r-custom-image"):
"""
Create a Docker image with R installed and the specified R packages.
Parameters:
r_packages (list): A list of R packages to install (e.g., ['dplyr', 'fable']).
image_name (str): Name of the Docker image to create.
"""
# Dockerfile template
package_string = ", ".join([f"'{pkg}'" for pkg in r_packages])
dockerfile_template = f"""
FROM rocker/r-base:latest
# Install required system dependencies
RUN echo 'APT::Install-Suggests "0";' >> /etc/apt/apt.conf.d/00-docker
RUN echo 'APT::Install-Recommends "0";' >> /etc/apt/apt.conf.d/00-docker
RUN DEBIAN_FRONTEND=noninteractive \
apt-get update && \
apt-get install -y libudunits2-dev libgdal-dev libssl-dev libfontconfig1-dev libgsl-dev
# Install R packages
RUN R -e "install.packages(c({package_string}), repos='http://cran.r-project.org')"
"""
folder = tempfile.TemporaryDirectory()
with open(folder.name + "/Dockerfile", "w") as dockerfile:
dockerfile.write(dockerfile_template)
# texio = TextIOWrapper(BytesIO(dockerfile_template.encode('utf-8')))
# texio.name = 'Dockerfile'
# docker_image_from_fo(texio, image_name)
# return
# Save the Dockerfile to a temporary file
dockerfile_path = "./Dockerfile"
# dockerfile.write(dockerfile_template)
# Initialize the Docker client
client = docker.from_env()
try:
# Build the Docker image
print(f"Building the Docker image: {image_name}...")
image, logs = client.images.build(path=folder.name + "/", tag=image_name)
# Display build logs
for log in logs:
print(log.get("stream", "").strip())
print(f"Docker image '{image_name}' created successfully.")
except Exception as e:
print(f"Error while building the Docker image: {e}")
finally:
# Clean up the Dockerfile
os.remove(dockerfile_path)
if __name__ == "__main__":
create_image(["dplyr", "fable"], image_name="r-dplyr-fable")