Skip to content
This repository was archived by the owner on Nov 30, 2023. It is now read-only.

Commit 02c1991

Browse files
Update Java settings and JDK requirement in Java containers (#1448)
1 parent 95a5401 commit 02c1991

File tree

16 files changed

+609
-32
lines changed

16 files changed

+609
-32
lines changed

containers/azure-functions-java-11/.devcontainer/devcontainer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
"vscode": {
1010
// Set *default* container specific settings.json values on container create.
1111
"settings": {
12-
"java.home": "/usr/lib/jvm/zulu-11-azure-amd64"
1312
},
1413

1514
// Add the IDs of extensions you want installed when the container is created.

containers/azure-functions-java-8/.devcontainer/devcontainer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"vscode": {
1010
// Set *default* container specific settings.json values on container create.
1111
"settings": {
12-
"java.home": "/usr/lib/jvm/zulu-11-azure-amd64",
12+
"java.import.gradle.java.home": "/usr/lib/jvm/zulu-8-amd64",
1313
"java.configuration.runtimes": [
1414
{
1515
"default": true,

containers/clojure/.devcontainer/devcontainer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"vscode": {
2424
// Set *default* container specific settings.json values on container create.
2525
"settings": {
26-
"java.home": "/docker-java-home"
2726
},
2827

2928
// Add the IDs of extensions you want installed when the container is created.

containers/java-8/.devcontainer/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): buster, bullseye
22
ARG VARIANT="buster"
3-
FROM mcr.microsoft.com/vscode/devcontainers/java:0-8-${VARIANT}
3+
FROM mcr.microsoft.com/vscode/devcontainers/java:1-8-${VARIANT}
44

55
# [Option] Install Maven
66
ARG INSTALL_MAVEN="false"

containers/java-8/.devcontainer/base.Dockerfile

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,34 @@
11
# [Choice] Debian OS version (use bullseye on local arm64/Apple Silicon): buster, bullseye
22
ARG VARIANT="bullseye"
3-
FROM mcr.microsoft.com/vscode/devcontainers/java:0-11-${VARIANT}
3+
FROM mcr.microsoft.com/vscode/devcontainers/base:${VARIANT}
44

55
# Install JDK 8 and optionally Maven and Gradle - version of "" installs latest
66
ARG JDK8_VERSION=""
77
ARG INSTALL_MAVEN="false"
88
ARG MAVEN_VERSION=""
99
ARG INSTALL_GRADLE="false"
1010
ARG GRADLE_VERSION=""
11-
COPY library-scripts/meta.env /usr/local/etc/vscode-dev-containers
12-
RUN su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && if [ "${JDK8_VERSION}" = "" ]; then \
13-
sdk install java \$(sdk ls java | grep -m 1 -o ' 8.*.-tem ' | awk '{print \$NF}'); \
14-
else sdk install java '${JDK8_VERSION}'; fi" \
15-
&& if [ "${INSTALL_MAVEN}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install maven \"${MAVEN_VERSION}\""; fi \
16-
&& if [ "${INSTALL_GRADLE}" = "true" ]; then su vscode -c "umask 0002 && . /usr/local/sdkman/bin/sdkman-init.sh && sdk install gradle \"${GRADLE_VERSION}\""; fi
11+
# Copy library scripts to execute
12+
COPY library-scripts/*.sh library-scripts/*.env /tmp/library-scripts/
13+
14+
ENV SDKMAN_DIR="/usr/local/sdkman"
15+
ENV PATH="${SDKMAN_DIR}/candidates/java/current/bin:${PATH}:${SDKMAN_DIR}/candidates/maven/current/bin:${SDKMAN_DIR}/candidates/gradle/current/bin"
16+
RUN if [ "${JDK8_VERSION}" = "" ]; then bash /tmp/library-scripts/java-debian.sh "8" "${SDKMAN_DIR}" "${USERNAME}" "true" \
17+
else bash /tmp/library-scripts/java-debian.sh "${JDK8_VERSION}" "${SDKMAN_DIR}" "${USERNAME}" "true"; fi \
18+
&& if [ "${INSTALL_MAVEN}" = "true" ]; then bash /tmp/library-scripts/maven-debian.sh "${MAVEN_VERSION:-latest}" "${SDKMAN_DIR}" ${USERNAME} "true"; fi \
19+
&& if [ "${INSTALL_GRADLE}" = "true" ]; then bash /tmp/library-scripts/gradle-debian.sh "${GRADLE_VERSION:-latest}" "${SDKMAN_DIR}" ${USERNAME} "true"; fi \
20+
&& apt-get clean -y && rm -rf /var/lib/apt/lists/*
1721

1822
# [Choice] Node.js version: none, lts/*, 16, 14, 12, 10
1923
ARG NODE_VERSION="none"
20-
RUN if [ "${NODE_VERSION}" != "none" ]; then su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi
24+
ENV NVM_DIR=/usr/local/share/nvm
25+
ENV NVM_SYMLINK_CURRENT=true \
26+
PATH="${NVM_DIR}/current/bin:${PATH}"
27+
RUN bash /tmp/library-scripts/node-debian.sh "${NVM_DIR}" "${NODE_VERSION}" "${USERNAME}" \
28+
&& apt-get clean -y && rm -rf /var/lib/apt/lists/*
29+
30+
# Remove library scripts for final image
31+
RUN rm -rf /tmp/library-scripts
2132

2233
# [Optional] Uncomment this section to install additional OS packages.
2334
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \

containers/java-8/.devcontainer/devcontainer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
"vscode": {
2020
// Set *default* container specific settings.json values on container create.
2121
"settings": {
22-
"java.home": "/docker-java-home",
2322
"java.import.gradle.java.home": "/usr/local/sdkman/candidates/java/current",
2423
"java.configuration.runtimes": [{
2524
"default": true,
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#!/usr/bin/env bash
2+
#-------------------------------------------------------------------------------------------------------------
3+
# Copyright (c) Microsoft Corporation. All rights reserved.
4+
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
5+
#-------------------------------------------------------------------------------------------------------------
6+
#
7+
# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/gradle.md
8+
# Maintainer: The VS Code and Codespaces Teams
9+
#
10+
# Syntax: ./gradle-debian.sh [Gradle version] [SDKMAN_DIR] [non-root user] [Update rc files flag]
11+
12+
GRADLE_VERSION=${1:-"latest"}
13+
export SDKMAN_DIR=${2:-"/usr/local/sdkman"}
14+
USERNAME=${3:-"automatic"}
15+
UPDATE_RC=${4:-"true"}
16+
17+
set -e
18+
19+
if [ "$(id -u)" -ne 0 ]; then
20+
echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
21+
exit 1
22+
fi
23+
24+
# Ensure that login shells get the correct path if the user updated the PATH using ENV.
25+
rm -f /etc/profile.d/00-restore-env.sh
26+
echo "export PATH=${PATH//$(sh -lc 'echo $PATH')/\$PATH}" > /etc/profile.d/00-restore-env.sh
27+
chmod +x /etc/profile.d/00-restore-env.sh
28+
29+
# Determine the appropriate non-root user
30+
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
31+
USERNAME=""
32+
POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)")
33+
for CURRENT_USER in ${POSSIBLE_USERS[@]}; do
34+
if id -u ${CURRENT_USER} > /dev/null 2>&1; then
35+
USERNAME=${CURRENT_USER}
36+
break
37+
fi
38+
done
39+
if [ "${USERNAME}" = "" ]; then
40+
USERNAME=root
41+
fi
42+
elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
43+
USERNAME=root
44+
fi
45+
46+
updaterc() {
47+
if [ "${UPDATE_RC}" = "true" ]; then
48+
echo "Updating /etc/bash.bashrc and /etc/zsh/zshrc..."
49+
if [[ "$(cat /etc/bash.bashrc)" != *"$1"* ]]; then
50+
echo -e "$1" >> /etc/bash.bashrc
51+
fi
52+
if [ -f "/etc/zsh/zshrc" ] && [[ "$(cat /etc/zsh/zshrc)" != *"$1"* ]]; then
53+
echo -e "$1" >> /etc/zsh/zshrc
54+
fi
55+
fi
56+
}
57+
58+
# Function to run apt-get if needed
59+
apt_get_update_if_needed()
60+
{
61+
if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then
62+
echo "Running apt-get update..."
63+
apt-get update
64+
else
65+
echo "Skipping apt-get update."
66+
fi
67+
}
68+
69+
# Checks if packages are installed and installs them if not
70+
check_packages() {
71+
if ! dpkg -s "$@" > /dev/null 2>&1; then
72+
apt_get_update_if_needed
73+
apt-get -y install --no-install-recommends "$@"
74+
fi
75+
}
76+
77+
# Use SDKMAN to install something using a partial version match
78+
sdk_install() {
79+
local install_type=$1
80+
local requested_version=$2
81+
local prefix=$3
82+
local suffix="${4:-"\\s*"}"
83+
local full_version_check=${5:-".*-[a-z]+"}
84+
if [ "${requested_version}" = "none" ]; then return; fi
85+
# Blank will install latest stable version
86+
if [ "${requested_version}" = "lts" ] || [ "${requested_version}" = "default" ]; then
87+
requested_version=""
88+
elif echo "${requested_version}" | grep -oE "${full_version_check}" > /dev/null 2>&1; then
89+
echo "${requested_version}"
90+
else
91+
local regex="${prefix}\\K[0-9]+\\.[0-9]+\\.[0-9]+${suffix}"
92+
local version_list="$(. ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk list ${install_type} 2>&1 | grep -oP "${regex}" | tr -d ' ' | sort -rV)"
93+
if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then
94+
requested_version="$(echo "${version_list}" | head -n 1)"
95+
else
96+
set +e
97+
requested_version="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")"
98+
set -e
99+
fi
100+
if [ -z "${requested_version}" ] || ! echo "${version_list}" | grep "^${requested_version//./\\.}$" > /dev/null 2>&1; then
101+
echo -e "Version $2 not found. Available versions:\n${version_list}" >&2
102+
exit 1
103+
fi
104+
fi
105+
su ${USERNAME} -c "umask 0002 && . ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk install ${install_type} ${requested_version} && sdk flush archives && sdk flush temp"
106+
}
107+
108+
export DEBIAN_FRONTEND=noninteractive
109+
110+
# Install dependencies
111+
check_packages curl ca-certificates zip unzip sed
112+
113+
# Install sdkman if not installed
114+
if [ ! -d "${SDKMAN_DIR}" ]; then
115+
# Create sdkman group, dir, and set sticky bit
116+
if ! cat /etc/group | grep -e "^sdkman:" > /dev/null 2>&1; then
117+
groupadd -r sdkman
118+
fi
119+
usermod -a -G sdkman ${USERNAME}
120+
umask 0002
121+
# Install SDKMAN
122+
curl -sSL "https://get.sdkman.io?rcupdate=false" | bash
123+
chown -R :sdkman ${SDKMAN_DIR}
124+
find ${SDKMAN_DIR} -type d | xargs -d '\n' chmod g+s
125+
# Add sourcing of sdkman into bashrc/zshrc files (unless disabled)
126+
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh"
127+
fi
128+
129+
# Install gradle
130+
sdk_install gradle ${GRADLE_VERSION} '\s\s' '\s\s' '^[0-9]+\.[0-9]+\.[0-9]+$'
131+
updaterc '[ -z "${GRADLE_USER_HOME}" ] && export GRADLE_USER_HOME=${HOME}/.gradle'
132+
133+
echo "Done!"
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
#!/usr/bin/env bash
2+
#-------------------------------------------------------------------------------------------------------------
3+
# Copyright (c) Microsoft Corporation. All rights reserved.
4+
# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
5+
#-------------------------------------------------------------------------------------------------------------
6+
#
7+
# Docs: https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/java.md
8+
# Maintainer: The VS Code and Codespaces Teams
9+
#
10+
# Syntax: ./java-debian.sh [JDK version] [SDKMAN_DIR] [non-root user] [Add to rc files flag]
11+
12+
JAVA_VERSION=${1:-"lts"}
13+
export SDKMAN_DIR=${2:-"/usr/local/sdkman"}
14+
USERNAME=${3:-"automatic"}
15+
UPDATE_RC=${4:-"true"}
16+
17+
set -e
18+
19+
if [ "$(id -u)" -ne 0 ]; then
20+
echo -e 'Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
21+
exit 1
22+
fi
23+
24+
# Ensure that login shells get the correct path if the user updated the PATH using ENV.
25+
rm -f /etc/profile.d/00-restore-env.sh
26+
echo "export PATH=${PATH//$(sh -lc 'echo $PATH')/\$PATH}" > /etc/profile.d/00-restore-env.sh
27+
chmod +x /etc/profile.d/00-restore-env.sh
28+
29+
# Determine the appropriate non-root user
30+
if [ "${USERNAME}" = "auto" ] || [ "${USERNAME}" = "automatic" ]; then
31+
USERNAME=""
32+
POSSIBLE_USERS=("vscode" "node" "codespace" "$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)")
33+
for CURRENT_USER in ${POSSIBLE_USERS[@]}; do
34+
if id -u ${CURRENT_USER} > /dev/null 2>&1; then
35+
USERNAME=${CURRENT_USER}
36+
break
37+
fi
38+
done
39+
if [ "${USERNAME}" = "" ]; then
40+
USERNAME=root
41+
fi
42+
elif [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
43+
USERNAME=root
44+
fi
45+
46+
updaterc() {
47+
if [ "${UPDATE_RC}" = "true" ]; then
48+
echo "Updating /etc/bash.bashrc and /etc/zsh/zshrc..."
49+
if [[ "$(cat /etc/bash.bashrc)" != *"$1"* ]]; then
50+
echo -e "$1" >> /etc/bash.bashrc
51+
fi
52+
if [ -f "/etc/zsh/zshrc" ] && [[ "$(cat /etc/zsh/zshrc)" != *"$1"* ]]; then
53+
echo -e "$1" >> /etc/zsh/zshrc
54+
fi
55+
fi
56+
}
57+
58+
# Function to run apt-get if needed
59+
apt_get_update_if_needed()
60+
{
61+
if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then
62+
echo "Running apt-get update..."
63+
apt-get update
64+
else
65+
echo "Skipping apt-get update."
66+
fi
67+
}
68+
69+
# Checks if packages are installed and installs them if not
70+
check_packages() {
71+
if ! dpkg -s "$@" > /dev/null 2>&1; then
72+
apt_get_update_if_needed
73+
apt-get -y install --no-install-recommends "$@"
74+
fi
75+
}
76+
77+
# Use SDKMAN to install something using a partial version match
78+
sdk_install() {
79+
local install_type=$1
80+
local requested_version=$2
81+
local prefix=$3
82+
local suffix="${4:-"\\s*"}"
83+
local full_version_check=${5:-".*-[a-z]+"}
84+
if [ "${requested_version}" = "none" ]; then return; fi
85+
# Blank will install latest stable version SDKMAN has
86+
if [ "${requested_version}" = "lts" ] || [ "${requested_version}" = "default" ]; then
87+
requested_version=""
88+
elif echo "${requested_version}" | grep -oE "${full_version_check}" > /dev/null 2>&1; then
89+
echo "${requested_version}"
90+
else
91+
local regex="${prefix}\\K[0-9]+\\.[0-9]+\\.[0-9]+${suffix}"
92+
local version_list="$(. ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk list ${install_type} 2>&1 | grep -oP "${regex}" | tr -d ' ' | sort -rV)"
93+
if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then
94+
requested_version="$(echo "${version_list}" | head -n 1)"
95+
else
96+
set +e
97+
requested_version="$(echo "${version_list}" | grep -E -m 1 "^${requested_version//./\\.}([\\.\\s]|$)")"
98+
set -e
99+
fi
100+
if [ -z "${requested_version}" ] || ! echo "${version_list}" | grep "^${requested_version//./\\.}$" > /dev/null 2>&1; then
101+
echo -e "Version $2 not found. Available versions:\n${version_list}" >&2
102+
exit 1
103+
fi
104+
fi
105+
su ${USERNAME} -c "umask 0002 && . ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk install ${install_type} ${requested_version} && sdk flush archives && sdk flush temp"
106+
}
107+
108+
export DEBIAN_FRONTEND=noninteractive
109+
110+
architecture="$(uname -m)"
111+
if [ "${architecture}" != "amd64" ] && [ "${architecture}" != "x86_64" ] && [ "${architecture}" != "arm64" ] && [ "${architecture}" != "aarch64" ]; then
112+
echo "(!) Architecture $architecture unsupported"
113+
exit 1
114+
fi
115+
116+
# Install dependencies
117+
check_packages curl ca-certificates zip unzip sed
118+
119+
# Install sdkman if not installed
120+
if [ ! -d "${SDKMAN_DIR}" ]; then
121+
# Create sdkman group, dir, and set sticky bit
122+
if ! cat /etc/group | grep -e "^sdkman:" > /dev/null 2>&1; then
123+
groupadd -r sdkman
124+
fi
125+
usermod -a -G sdkman ${USERNAME}
126+
umask 0002
127+
# Install SDKMAN
128+
curl -sSL "https://get.sdkman.io?rcupdate=false" | bash
129+
chown -R :sdkman ${SDKMAN_DIR}
130+
find ${SDKMAN_DIR} -type d | xargs -d '\n' chmod g+s
131+
# Add sourcing of sdkman into bashrc/zshrc files (unless disabled)
132+
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh"
133+
fi
134+
135+
# Use Microsoft JDK for everything but JDK 8
136+
jdk_distro="ms"
137+
if echo "${JAVA_VERSION}" | grep -E '^8([\s\.]|$)' > /dev/null 2>&1; then
138+
jdk_distro="tem"
139+
fi
140+
if [ "${JAVA_VERSION}" = "lts" ]; then
141+
JAVA_VERSION="17"
142+
fi
143+
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-${jdk_distro}\\s*" ".*-[a-z]+$"
144+
145+
echo "Done!"

0 commit comments

Comments
 (0)