I have the following Dockerfile
where I want to build a Docker container from the image at https://hub.docker.com/r/julianassmann/opencv-cuda/:
FROM julianassmann/opencv-cuda
#image name with OpenCV with CUDA
# Edit /etc/default/docker file to add custom DNS server
RUN echo 'DOCKER_OPTS="--dns 172.16.16.10"' >> /etc/default/docker
#working directory where i have placed container
#on top of container
RUN apt-get update
RUN apt-get -y install sudo
# Install additional packages
RUN sudo apt update \
#prevent interactive prompts
&& export DEBIAN_FRONTEND=noninteractive \
&& apt install -y lubuntu-desktop net-tools pip python3-tk \
# Clean up no longer required by any other packages
&& apt autoremove -y \
#removes cached package files that were downloaded during the package installation
&& apt clean -y \
#cached package lists and can be safely removed after installing packages
&& rm -rf /var/lib/apt/lists/* \
#removes any files with names starting with reboot-required in the /run/ directory to prevent reboot after installing packages
&& rm /run/reboot-required*
# Create a non-root user with sudo priviledges
ARG USERNAME=user
ARG PASSWORD=password
ARG USER_UID=1000
ARG USER_GID=$USER_UID # Group ID (GID) of the user being created
#Creates a group with the specified USER_GID and name USERNAME
RUN groupadd --gid $USER_GID $USERNAME \
#Creates a user with the specified USER_UID, USER_GID, USERNAME, and encrypted password generated from the PASSWORD.
#The -m flag ensures that a home directory is created for the user.
#/bin/bash refers to the Bash shell executable binary file. Unix-like operating system,you specify the user's default shell
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME -p $(openssl passwd $PASSWORD) \
# [Optional] Add sudo support for the non-root user
&& apt update \
&& apt install -y sudo \
#username allow execute commands as root without entering a password
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
#Sets appropriate permissions
&& chmod 0440 /etc/sudoers.d/$USERNAME \
# Clean up
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /var/lib/apt/lists/* \
# provide auto-completion functionality when typing commands in the Bash shell
&& echo "source /usr/share/bash-completion/completions/git" >> /home/$USERNAME/.bashrc \
# Configure remote desktop
RUN adduser xrdp ssl-cert
RUN sed -i '3 a echo " \
export GNOME_SHELL_SESSION_MODE=Lubuntu\\n\
export XDG_SESSION_TYPE=x11\\n\
export XDG_CURRENT_DESKTOP=LXQt\\n\
export XDG_CONFIG_DIRS=/etc/xdg/xdg-Lubuntu:/etc/xdg\\n\
" > ~/.xsessionrc' /etc/xrdp/startwm.sh
#default port used by Remote Desktop Protocol (RDP)
EXPOSE 3389
# Install Python dependencies
COPY requirements.txt .
RUN pip install --disable-pip-version-check --no-cache-dir -U -r requirements.txt \
&& rm requirements.txt
# Start xrdp and a bash terminal
CMD service xrdp start ; bash
I have the following error:
ERROR: failed to solve: process "/bin/sh -c apt-get update" did not complete successfully: exit code: 100
I don't understand the problem as I have installed sudo
with the previous commands:
RUN apt-get update
RUN apt-get -y install sudo
I downloaded your Dockerfile
and first error which you also stated is connected with apt-get update
, it states that it can not find signatures (Public part of GPG keys) for nvidia
packages.
5.095 W: GPG error: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC
5.095 E: The repository 'https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease' is not signed.
I found the solution for this part on https://askubuntu.com/questions/1444943/nvidia-gpg-error-the-following-signatures-couldnt-be-verified-because-the-publi
Fix is to add public keys before your apt-get update
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
RUN apt-get update
RUN apt-get -y install sudo
Like so.
When this step was done I tried rebuilding the image again, and then you have an error with installing pip
on Ubuntu 18.
On this line:
&& apt install -y lubuntu-desktop net-tools python3-pip python3-tk \
2.876 Reading state information...
2.937 E: Unable to locate package pip
And the fix for this is found here:
"E: Unable to locate package python-pip" on Ubuntu 18.04
Which says you need to install python3-pip
instead of just pip
for the python3
dependency.
Which makes it:
&& apt install -y lubuntu-desktop net-tools python3-pip python3-tk \
The whole Dockerfile
with these adjustments is:
FROM julianassmann/opencv-cuda
#image name with OpenCV with CUDA
# Edit /etc/default/docker file to add custom DNS server
RUN echo 'DOCKER_OPTS="--dns 172.16.16.10"' >> /etc/default/docker
#working directory where i have placed container
#on top of container
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub
RUN apt-get update
RUN apt-get -y install sudo
# Install additional packages
RUN apt update \
#prevent interactive prompts
&& export DEBIAN_FRONTEND=noninteractive \
&& apt install -y lubuntu-desktop net-tools python3-pip python3-tk \
# Clean up no longer required by any other packages
&& apt autoremove -y \
#removes cached package files that were downloaded during the package installation
&& apt clean -y \
#cached package lists and can be safely removed after installing packages
&& rm -rf /var/lib/apt/lists/* \
#removes any files with names starting with reboot-required in the /run/ directory to prevent reboot after installing packages
&& rm /run/reboot-required*
# Create a non-root user with sudo priviledges
ARG USERNAME=user
ARG PASSWORD=password
ARG USER_UID=1000
ARG USER_GID=$USER_UID # Group ID (GID) of the user being created
#Creates a group with the specified USER_GID and name USERNAME
RUN groupadd --gid $USER_GID $USERNAME \
#Creates a user with the specified USER_UID, USER_GID, USERNAME, and encrypted password generated from the PASSWORD.
#The -m flag ensures that a home directory is created for the user.
#/bin/bash refers to the Bash shell executable binary file. Unix-like operating system,you specify the user's default shell
&& useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME -p $(openssl passwd $PASSWORD) \
# [Optional] Add sudo support for the non-root user
&& apt update \
&& apt install -y sudo \
#username allow execute commands as root without entering a password
&& echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME\
#Sets appropriate permissions
&& chmod 0440 /etc/sudoers.d/$USERNAME \
# Clean up
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /var/lib/apt/lists/* \
# provide auto-completion functionality when typing commands in the Bash shell
&& echo "source /usr/share/bash-completion/completions/git" >> /home/$USERNAME/.bashrc \
# Configure remote desktop
RUN adduser xrdp ssl-cert
RUN sed -i '3 a echo " \
export GNOME_SHELL_SESSION_MODE=Lubuntu\\n\
export XDG_SESSION_TYPE=x11\\n\
export XDG_CURRENT_DESKTOP=LXQt\\n\
export XDG_CONFIG_DIRS=/etc/xdg/xdg-Lubuntu:/etc/xdg\\n\
" > ~/.xsessionrc' /etc/xrdp/startwm.sh
#default port used by Remote Desktop Protocol (RDP)
EXPOSE 3389
# Install Python dependencies
COPY requirements.txt .
RUN pip install --disable-pip-version-check --no-cache-dir -U -r requirements.txt \
&& rm requirements.txt
# Start xrdp and a bash terminal
CMD service xrdp start ; bash
NOTE:
You still have one more error to solve:
[ 9/11] RUN sed -i '3 a echo " export GNOME_SHELL_SESSION_MODE=Lubuntu\n export XDG_SESSION_TYPE=x11\n export XDG_CURRENT_DESKTOP=LXQt\n export XDG_CONFIG_DIRS=/etc/xdg/xdg-Lubuntu:/etc/xdg\n " > ~/.xsessionrc' /etc/xrdp/startwm.sh: 0.419 sed: can't read /etc/xrdp/startwm.sh: No such file or directory
But I commented out this line from the Dockerfile
, and it was built, Using the command docker image build -t cuda-test:0.0.1 .