From 63c0be61e206848c4d711f73c731e3fc2d2e91aa Mon Sep 17 00:00:00 2001 From: Chuck Lantz Date: Wed, 5 Aug 2020 14:46:33 -0700 Subject: [PATCH] Update R to use library-scripts approach --- containers/r/.devcontainer/Dockerfile | 40 ++---- containers/r/.devcontainer/devcontainer.json | 7 +- .../r/.devcontainer/library-scripts/README.md | 5 + .../library-scripts/common-debian.sh | 123 ++++++++++++++++++ containers/r/.npmignore | 1 + 5 files changed, 142 insertions(+), 34 deletions(-) create mode 100644 containers/r/.devcontainer/library-scripts/README.md create mode 100755 containers/r/.devcontainer/library-scripts/common-debian.sh diff --git a/containers/r/.devcontainer/Dockerfile b/containers/r/.devcontainer/Dockerfile index c23ef246..a453c574 100644 --- a/containers/r/.devcontainer/Dockerfile +++ b/containers/r/.devcontainer/Dockerfile @@ -1,40 +1,18 @@ FROM rocker/r-apt:bionic -# This Dockerfile adds a non-root user with sudo access. Update the “remoteUser” property in -# devcontainer.json to use it. More info: https://aka.ms/vscode-remote/containers/non-root-user. +# Options for setup script +ARG INSTALL_ZSH="true" +ARG UPGRADE_PACKAGES="true" +ARG USERNAME=docker ARG USER_UID=1000 ARG USER_GID=$USER_UID # Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies. -RUN apt-get update \ - && export DEBIAN_FRONTEND=noninteractive \ - && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ - # - # install git iproute2, process tools, lsb-release (common in install instructions for CLIs) and libzip for R Tools extension - && apt-get -y install git openssh-client less iproute2 procps lsb-release libzip-dev \ - # - # Register Microsoft key and feed - && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb \ - && dpkg -i packages-microsoft-prod.deb \ - # - # Install the .NET Runtime - && add-apt-repository universe \ - && apt-get install apt-transport-https \ - && apt-get update \ - && apt-get -y install dotnet-runtime-2.1 \ - # - # [Optional] Update a non-root user to match UID/GID - see https://aka.ms/vscode-remote/containers/non-root-user. - && if [ "$USER_GID" != "1000" ]; then groupmod docker --gid $USER_GID; fi \ - && if [ "$USER_UID" != "1000" ]; then usermod --uid $USER_UID docker; fi \ - # [Optional] Add sudo support for the non-root user - && apt-get install -y sudo \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/docker\ - && chmod 0440 /etc/sudoers.d/docker \ - # - # Clean up - && apt-get autoremove -y \ - && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* +COPY library-scripts/*.sh /tmp/library-scripts/ +RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ + && /bin/bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \ + && apt-get -y install libzip-dev \ + && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts # [Optional] Uncomment this section to install additional OS packages. # RUN apt-get update \ diff --git a/containers/r/.devcontainer/devcontainer.json b/containers/r/.devcontainer/devcontainer.json index 2a01a515..02137137 100644 --- a/containers/r/.devcontainer/devcontainer.json +++ b/containers/r/.devcontainer/devcontainer.json @@ -1,6 +1,8 @@ { "name": "R", - "dockerFile": "Dockerfile", + "build": { + "dockerfile": "Dockerfile", + }, "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], // Set *default* container specific settings.json values on container create. @@ -10,8 +12,7 @@ // Add the IDs of extensions you want installed when the container is created. "extensions": [ - "ikuyadeu.r", - "mikhail-arkhipov.r" + "ikuyadeu.r" ] // Use 'forwardPorts' to make a list of ports inside the container available locally. diff --git a/containers/r/.devcontainer/library-scripts/README.md b/containers/r/.devcontainer/library-scripts/README.md new file mode 100644 index 00000000..d06dfd1a --- /dev/null +++ b/containers/r/.devcontainer/library-scripts/README.md @@ -0,0 +1,5 @@ +# Warning: Folder contents may be replaced + +The contents of this folder will be automatically replaced with a file of the same name in the [vscode-dev-containers](https://github.com/microsoft/vscode-dev-containers) repository's [script-library folder](https://github.com/microsoft/vscode-dev-containers/tree/master/script-library) whenever the repository is packaged. + +To retain your edits, move the file to a different location. You may also delete the files if they are not needed. \ No newline at end of file diff --git a/containers/r/.devcontainer/library-scripts/common-debian.sh b/containers/r/.devcontainer/library-scripts/common-debian.sh new file mode 100755 index 00000000..ffef7ba2 --- /dev/null +++ b/containers/r/.devcontainer/library-scripts/common-debian.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +# Syntax: ./common-debian.sh + +set -e + +INSTALL_ZSH=${1:-"true"} +USERNAME=${2:-"$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)"} +USER_UID=${3:-1000} +USER_GID=${4:-1000} +UPGRADE_PACKAGES=${5:-"true"} + +if [ "$(id -u)" -ne 0 ]; then + echo 'Script must be run a root. Use sudo or set "USER root" before running the script.' + exit 1 +fi + +# Treat a user name of "none" as root +if [ "${USERNAME}" = "none" ] || [ "${USERNAME}" = "root" ]; then + USERNAME=root + USER_UID=0 + USER_GID=0 +fi + +# Ensure apt is in non-interactive to avoid prompts +export DEBIAN_FRONTEND=noninteractive + +# Install apt-utils to avoid debconf warning +apt-get -y install --no-install-recommends apt-utils 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) + +# Get to latest versions of all packages +if [ "${UPGRADE_PACKAGES}" = "true" ]; then + apt-get -y upgrade --no-install-recommends +fi + +# Install common developer tools and dependencies +apt-get -y install --no-install-recommends \ + git \ + openssh-client \ + less \ + iproute2 \ + procps \ + curl \ + wget \ + unzip \ + nano \ + jq \ + lsb-release \ + ca-certificates \ + apt-transport-https \ + dialog \ + gnupg2 \ + libc6 \ + libgcc1 \ + libgssapi-krb5-2 \ + libicu[0-9][0-9] \ + liblttng-ust0 \ + libstdc++6 \ + zlib1g \ + locales + +# Ensure at least the en_US.UTF-8 UTF-8 locale is available. +# Common need for both applications and things like the agnoster ZSH theme. +echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen +locale-gen + +# Install libssl1.1 if available +if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then + apt-get -y install --no-install-recommends libssl1.1 +fi + +# Install appropriate version of libssl1.0.x if available +LIBSSL=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '') +if [ "$(echo "$LIBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then + if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then + # Debian 9 + apt-get -y install --no-install-recommends libssl1.0.2 + elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then + # Ubuntu 18.04, 16.04, earlier + apt-get -y install --no-install-recommends libssl1.0.0 + fi +fi + +# Create or update a non-root user to match UID/GID - see https://aka.ms/vscode-remote/containers/non-root-user. +if id -u $USERNAME > /dev/null 2>&1; then + # User exists, update if needed + if [ "$USER_GID" != "$(id -G $USERNAME)" ]; then + groupmod --gid $USER_GID $USERNAME + usermod --gid $USER_GID $USERNAME + fi + if [ "$USER_UID" != "$(id -u $USERNAME)" ]; then + usermod --uid $USER_UID $USERNAME + fi +else + # Create user + groupadd --gid $USER_GID $USERNAME + useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME +fi + +# Add add sudo support for non-root user +apt-get install -y sudo +echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME +chmod 0440 /etc/sudoers.d/$USERNAME + +# Ensure ~/.local/bin is in the PATH for root and non-root users for bash. (zsh is later) +echo "export PATH=\$PATH:\$HOME/.local/bin" | tee -a /root/.bashrc >> /home/$USERNAME/.bashrc +chown $USER_UID:$USER_GID /home/$USERNAME/.bashrc + +# Optionally install and configure zsh +if [ "$INSTALL_ZSH" = "true" ] && [ ! -d "/root/.oh-my-zsh" ]; then + apt-get install -y zsh + sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" + echo "export PATH=\$PATH:\$HOME/.local/bin" >> /root/.zshrc + cp -R /root/.oh-my-zsh /home/$USERNAME + cp /root/.zshrc /home/$USERNAME + sed -i -e "s/\/root\/.oh-my-zsh/\/home\/$USERNAME\/.oh-my-zsh/g" /home/$USERNAME/.zshrc + chown -R $USER_UID:$USER_GID /home/$USERNAME/.oh-my-zsh /home/$USERNAME/.zshrc +fi + diff --git a/containers/r/.npmignore b/containers/r/.npmignore index e4ebfc71..e1c966ce 100644 --- a/containers/r/.npmignore +++ b/containers/r/.npmignore @@ -1,5 +1,6 @@ README.md test-project definition-manifest.json +.devcontainer/library-scripts/README.md .vscode .npmignore