Unverified Commit 2963ae91 authored by Chuck Lantz's avatar Chuck Lantz Committed by GitHub

Fix privs in Node, regressions from #199 (#241)

Co-authored-by: 's avatarSamruddhi Khandale <skhandale@microsoft.com>
parent ab021f0d
{ {
"id": "node", "id": "node",
"version": "1.0.8", "version": "1.1.0",
"name": "Node.js (via nvm) and yarn", "name": "Node.js (via nvm) and yarn",
"documentationURL": "https://github.com/devcontainers/features/tree/main/src/node", "documentationURL": "https://github.com/devcontainers/features/tree/main/src/node",
"description": "Installs Node.js, nvm, yarn, and needed dependencies.", "description": "Installs Node.js, nvm, yarn, and needed dependencies.",
...@@ -27,6 +27,11 @@ ...@@ -27,6 +27,11 @@
"type": "string", "type": "string",
"default": "/usr/local/share/nvm", "default": "/usr/local/share/nvm",
"description": "The path where NVM will be installed." "description": "The path where NVM will be installed."
},
"nvmVersion": {
"type": "string",
"default": "0.39.2",
"description": "Version of NVM to install."
} }
}, },
"customizations": { "customizations": {
......
#!/bin/bash #!/bin/bash
#------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved. # Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. # Licensed under the MIT License. See https://github.com/devcontainers/features/blob/main/LICENSE for license information.
#------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------------------------
# #
# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/node.md # Docs: https://github.com/devcontainers/features/tree/main/src/node
# Maintainer: The VS Code and Codespaces Teams # Maintainer: The Dev Container spec maintainers
export NODE_VERSION=${VERSION:-"lts"} export NODE_VERSION=${VERSION:-"lts"}
export NVM_VERSION="${NVMVERSION:-"0.39.2"}"
export NVM_DIR=${NVMINSTALLPATH:-"/usr/local/share/nvm"} export NVM_DIR=${NVMINSTALLPATH:-"/usr/local/share/nvm"}
INSTALL_TOOLS_FOR_NODE_GYP="${NODEGYPDEPENDENCIES:-true}" INSTALL_TOOLS_FOR_NODE_GYP="${NODEGYPDEPENDENCIES:-true}"
...@@ -18,8 +19,6 @@ ADDITIONAL_VERSIONS=${ADDITIONALVERSIONS:-""} ...@@ -18,8 +19,6 @@ ADDITIONAL_VERSIONS=${ADDITIONALVERSIONS:-""}
USERNAME=${USERNAME:-"automatic"} USERNAME=${USERNAME:-"automatic"}
UPDATE_RC=${UPDATE_RC:-"true"} UPDATE_RC=${UPDATE_RC:-"true"}
export NVM_VERSION="0.38.0"
set -e set -e
# Clean up # Clean up
...@@ -105,67 +104,73 @@ elif [ "${NODE_VERSION}" = "latest" ]; then ...@@ -105,67 +104,73 @@ elif [ "${NODE_VERSION}" = "latest" ]; then
export NODE_VERSION="node" export NODE_VERSION="node"
fi fi
# Install snipppet that we will run as the user
nvm_install_snippet="$(cat << EOF
set -e
umask 0002
# Do not update profile - we'll do this manually
export PROFILE=/dev/null
curl -so- https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh | bash
source ${NVM_DIR}/nvm.sh
if [ "${NODE_VERSION}" != "" ]; then
nvm alias default ${NODE_VERSION}
fi
EOF
)"
# Snippet that should be added into rc / profiles
nvm_rc_snippet="$(cat << EOF
export NVM_DIR="${NVM_DIR}"
[ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh"
[ -s "\$NVM_DIR/bash_completion" ] && . "\$NVM_DIR/bash_completion"
EOF
)"
# Create a symlink to the installed version for use in Dockerfile PATH statements # Create a symlink to the installed version for use in Dockerfile PATH statements
export NVM_SYMLINK_CURRENT=true export NVM_SYMLINK_CURRENT=true
# Install the specified node version if NVM directory already exists, then exit # Create nvm group to the user's UID or GID to change while still allowing access to nvm
if [ -d "${NVM_DIR}" ]; then
echo "NVM already installed."
if [ "${NODE_VERSION}" != "" ]; then
su ${USERNAME} -c ". $NVM_DIR/nvm.sh && nvm install ${NODE_VERSION} && nvm clear-cache"
fi
# Clean up
rm -rf /var/lib/apt/lists/*
exit 0
fi
# Create nvm group, nvm dir, and set sticky bit
if ! cat /etc/group | grep -e "^nvm:" > /dev/null 2>&1; then if ! cat /etc/group | grep -e "^nvm:" > /dev/null 2>&1; then
groupadd -r nvm groupadd -r nvm
fi fi
umask 0002
usermod -a -G nvm ${USERNAME} usermod -a -G nvm ${USERNAME}
mkdir -p ${NVM_DIR}
chown "${USERNAME}:nvm" ${NVM_DIR} # Install nvm (which also installs NODE_VERSION), otherwise
chmod -R g+r+w ${NVM_DIR} # use nvm to install the specified node version. Always use
su ${USERNAME} -c "$(cat << EOF # umask 0002 so both the owner so that everything is u+rw,g+rw
set -e umask 0002
umask 0002 if [ ! -d "${NVM_DIR}" ]; then
# Do not update profile - we'll do this manually # Create nvm dir, and set sticky bit
export PROFILE=/dev/null mkdir -p ${NVM_DIR}
curl -so- https://raw.githubusercontent.com/nvm-sh/nvm/v${NVM_VERSION}/install.sh | bash chown "${USERNAME}:nvm" ${NVM_DIR}
source ${NVM_DIR}/nvm.sh chmod g+rws ${NVM_DIR}
su ${USERNAME} -c "${nvm_install_snippet}" 2>&1
# Update rc files
if [ "${UPDATE_RC}" = "true" ]; then
updaterc "${nvm_rc_snippet}"
fi
else
echo "NVM already installed."
if [ "${NODE_VERSION}" != "" ]; then if [ "${NODE_VERSION}" != "" ]; then
nvm alias default ${NODE_VERSION} su ${USERNAME} -c "umask 0002 && . $NVM_DIR/nvm.sh && nvm install ${NODE_VERSION}"
fi fi
nvm clear-cache
EOF
)" 2>&1
# Update rc files
if [ "${UPDATE_RC}" = "true" ]; then
updaterc "$(cat <<EOF
export NVM_DIR="${NVM_DIR}"
[ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh"
[ -s "\$NVM_DIR/bash_completion" ] && . "\$NVM_DIR/bash_completion"
EOF
)"
fi fi
# Additional node versions to be installed but not be set as default. # Additional node versions to be installed but not be set as
# default we can assume the nvm is the group owner of the nvm
# directory and the sticky bit on directories so any installed
# files will have will have the correct ownership (nvm)
if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
OLDIFS=$IFS OLDIFS=$IFS
IFS="," IFS=","
read -a additional_versions <<< "$ADDITIONAL_VERSIONS" read -a additional_versions <<< "$ADDITIONAL_VERSIONS"
for ver in "${additional_versions[@]}"; do for ver in "${additional_versions[@]}"; do
su ${USERNAME} -c ". $NVM_DIR/nvm.sh && nvm install ${ver}" su ${USERNAME} -c "umask 0002 && . $NVM_DIR/nvm.sh && nvm install ${ver}"
su ${USERNAME} -c ". $NVM_DIR/nvm.sh && nvm clear-cache"
# Reset the NODE_VERSION as the default version on the path.
done done
# Ensure $NODE_VERSION is on the $PATH # Ensure $NODE_VERSION is on the $PATH
if [ "${NODE_VERSION}" != "" ]; then if [ "${NODE_VERSION}" != "" ]; then
su ${USERNAME} -c ". $NVM_DIR/nvm.sh && nvm use default" su ${USERNAME} -c "umask 0002 && . $NVM_DIR/nvm.sh && nvm use default"
fi fi
IFS=$OLDIFS IFS=$OLDIFS
fi fi
...@@ -192,9 +197,14 @@ if [ "${INSTALL_TOOLS_FOR_NODE_GYP}" = "true" ]; then ...@@ -192,9 +197,14 @@ if [ "${INSTALL_TOOLS_FOR_NODE_GYP}" = "true" ]; then
fi fi
fi fi
find "${NVM_DIR}" -type d -print0 | xargs -n 1 -0 chmod g+s
# Clean up # Clean up
su ${USERNAME} -c "umask 0002 && . $NVM_DIR/nvm.sh && nvm clear-cache"
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
# Ensure privs are correct for installed node versions. Unfortunately the
# way nvm installs node versions pulls privs from the tar which does not
# have group write set. We need this when the gid/uid is updated.
chmod -R g+rw "${NVM_DIR}/versions"
echo "Done!" echo "Done!"
...@@ -5,7 +5,7 @@ set -e ...@@ -5,7 +5,7 @@ set -e
# Optional: Import test library # Optional: Import test library
source dev-container-features-test-lib source dev-container-features-test-lib
# 'latest' is some version of node 18 for a while. # 'lts' is some version of node 18 for a while.
check "version_on_path" node -v | grep 18 check "version_on_path" node -v | grep 18
check "v18_installed" ls -1 /usr/local/share/nvm/versions/node | grep 18 check "v18_installed" ls -1 /usr/local/share/nvm/versions/node | grep 18
......
#!/bin/bash
set -e
# Optional: Import test library
source dev-container-features-test-lib
# Definition specific tests
check "version" node --version
check "nvm" bash -c ". /usr/local/share/nvm/nvm.sh && nvm install 10"
# Report result
reportResults
\ No newline at end of file
...@@ -3,9 +3,18 @@ ...@@ -3,9 +3,18 @@
"image": "debian:11", "image": "debian:11",
"features": { "features": {
"node": { "node": {
"version": "latest", "version": "lts",
"additionalVersions": "v17.9.1,v14.19.3" "additionalVersions": "v17.9.1,v14.19.3"
} }
} }
},
"non_root_user": {
"image": "mcr.microsoft.com/devcontainers/base",
"remoteUser": "vscode",
"features": {
"node": {
"version": "latest"
}
}
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment