forked from deepjavalibrary/djl
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make initial devcontainer for Github Codespaces support
Per recommendation from Github, most files are copied from https://github.com/microsoft/vscode-dev-containers/tree/master/containers/java/.devcontainer The devcontainer.json has been modified to better suit the requirements for DJL. Change-Id: I9ca61a80251f11d9533036ce422c2eecdc34f41f
- Loading branch information
Showing
9 changed files
with
560 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
ARG VARIANT=11 | ||
FROM mcr.microsoft.com/vscode/devcontainers/java:${VARIANT} | ||
|
||
# [Optional] Install Maven or Gradle | ||
ARG INSTALL_MAVEN="false" | ||
ARG MAVEN_VERSION=3.6.3 | ||
ARG INSTALL_GRADLE="false" | ||
ARG GRADLE_VERSION=5.4.1 | ||
RUN if [ "${INSTALL_MAVEN}" = "true" ]; then su vscode -c "source /usr/local/sdkman/bin/sdkman-init.sh && sdk install maven \"${MAVEN_VERSION}\""; fi \ | ||
&& if [ "${INSTALL_GRADLE}" = "true" ]; then su vscode -c "source /usr/local/sdkman/bin/sdkman-init.sh && sdk install gradle \"${GRADLE_VERSION}\""; fi | ||
|
||
# [Optional] Install a version of Node.js using nvm for front end dev | ||
ARG INSTALL_NODE="true" | ||
ARG NODE_VERSION="lts/*" | ||
RUN if [ "${INSTALL_NODE}" = "true" ]; then su vscode -c "source /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"; fi | ||
|
||
# [Optional] Uncomment this section to install additional OS packages. | ||
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ | ||
# && apt-get -y install --no-install-recommends <your-package-list-here> | ||
|
||
# [Optional] Uncomment this line to install global node packages. | ||
# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g <your-package-here>" 2>&1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# Update the VARIANT arg in devcontainer.json to pick a Java version: 8, 11, 14 | ||
ARG VARIANT=11 | ||
FROM openjdk:${VARIANT}-jdk-buster | ||
|
||
# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies. | ||
ARG INSTALL_ZSH="true" | ||
ARG UPGRADE_PACKAGES="false" | ||
ARG USERNAME=vscode | ||
ARG USER_UID=1000 | ||
ARG USER_GID=$USER_UID | ||
COPY library-scripts/common-debian.sh /tmp/library-scripts/ | ||
RUN bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \ | ||
&& if [ ! -d "/docker-java-home" ]; then ln -s "${JAVA_HOME}" /docker-java-home; fi \ | ||
&& apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts | ||
|
||
# Install SDKMAN and optionally Maven and Gradle | ||
ARG INSTALL_MAVEN="false" | ||
ARG MAVEN_VERSION=3.6.3 | ||
ARG INSTALL_GRADLE="false" | ||
ARG GRADLE_VERSION=5.4.1 | ||
ENV SDKMAN_DIR="/usr/local/sdkman" | ||
ENV PATH="${PATH}:${SDKMAN_DIR}/java/current/bin:${SDKMAN_DIR}/maven/current/bin:${SDKMAN_DIR}/gradle/current/bin" | ||
COPY library-scripts/java-debian.sh /tmp/library-scripts/ | ||
RUN bash /tmp/library-scripts/java-debian.sh "none" "${SDKMAN_DIR}" "${USERNAME}" "true" \ | ||
&& if [ "${INSTALL_MAVEN}" = "true" ]; then bash /tmp/library-scripts/maven-debian.sh ${MAVEN_VERSION} "${SDKMAN_DIR}" ${USERNAME} "true"; fi \ | ||
&& if [ "${INSTALL_GRADLE}" = "true" ]; then bash /tmp/library-scripts/gradle-debian.sh ${GRADLE_VERSION} "${SDKMAN_DIR}" ${USERNAME} "true"; fi \ | ||
&& apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts | ||
|
||
# [Optional] Install Node.js for use with web applications - update the INSTALL_NODE arg in devcontainer.json to enable. | ||
ARG INSTALL_NODE="true" | ||
ARG NODE_VERSION="none" | ||
ENV NVM_DIR=/usr/local/share/nvm | ||
ENV NVM_SYMLINK_CURRENT=true \ | ||
PATH="${NVM_DIR}/current/bin:${PATH}" | ||
COPY library-scripts/node-debian.sh /tmp/library-scripts/ | ||
RUN if [ "$INSTALL_NODE" = "true" ]; then bash /tmp/library-scripts/node-debian.sh "${NVM_DIR}" "${NODE_VERSION}" "${USERNAME}"; fi \ | ||
&& 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 && export DEBIAN_FRONTEND=noninteractive \ | ||
# && apt-get -y install --no-install-recommends <your-package-list-here> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
{ | ||
"name": "Java", | ||
"build": { | ||
"dockerfile": "Dockerfile", | ||
"args": { | ||
"VARIANT": "11", | ||
"INSTALL_MAVEN": "false", | ||
"MAVEN_VERSION": "3.6.3", | ||
"INSTALL_GRADLE": "false", | ||
"GRADLE_VERSION": "6.5.1", | ||
"INSTALL_NODE": "false", | ||
"NODE_VERSION": "lts/*" | ||
} | ||
}, | ||
"settings": { | ||
"terminal.integrated.shell.linux": "/bin/bash", | ||
"java.checkstyle.configuration": "tools/conf/checkstyle.xml", | ||
"java.home": "/docker-java-home" | ||
}, | ||
"extensions": [ | ||
"vscjava.vscode-java-pack", | ||
"shengchen.vscode-checkstyle", | ||
"richardwillis.vscode-gradle", | ||
"naco-siren.gradle-language", | ||
"yzhang.markdown-all-in-one", | ||
"shd101wyy.markdown-preview-enhanced" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
#!/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 [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag] | ||
|
||
INSTALL_ZSH=${1:-"true"} | ||
USERNAME=${2:-"vscode"} | ||
USER_UID=${3:-1000} | ||
USER_GID=${4:-1000} | ||
UPGRADE_PACKAGES=${5:-"true"} | ||
|
||
set -e | ||
|
||
if [ "$(id -u)" -ne 0 ]; then | ||
echo -e 'Script must be run a root. Use sudo, su, or add "USER root" to your Dockerfile before running this 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 | ||
|
||
# Load markers to see which steps have already run | ||
MARKER_FILE="/usr/local/etc/vscode-dev-containers/common" | ||
if [ -f "${MARKER_FILE}" ]; then | ||
echo "Marker file found:" | ||
cat "${MARKER_FILE}" | ||
source "${MARKER_FILE}" | ||
fi | ||
|
||
# Ensure apt is in non-interactive to avoid prompts | ||
export DEBIAN_FRONTEND=noninteractive | ||
|
||
# Function to call apt-get if needed | ||
apt-get-update-if-needed() | ||
{ | ||
if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then | ||
echo "Running apt-get update..." | ||
apt-get update | ||
else | ||
echo "Skipping apt-get update." | ||
fi | ||
} | ||
|
||
# Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies | ||
if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then | ||
apt-get-update-if-needed | ||
|
||
PACKAGE_LIST="apt-utils \ | ||
git \ | ||
openssh-client \ | ||
less \ | ||
iproute2 \ | ||
procps \ | ||
curl \ | ||
wget \ | ||
unzip \ | ||
zip \ | ||
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 \ | ||
sudo" | ||
|
||
# Install libssl1.1 if available | ||
if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then | ||
PACKAGE_LIST="${PACKAGE_LIST} 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 | ||
PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.2" | ||
elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then | ||
# Ubuntu 18.04, 16.04, earlier | ||
PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.0" | ||
fi | ||
fi | ||
|
||
echo "Packages to verify are installed: ${PACKAGE_LIST}" | ||
apt-get -y install --no-install-recommends ${PACKAGE_LIST} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) | ||
|
||
PACKAGES_ALREADY_INSTALLED="true" | ||
fi | ||
|
||
# Get to latest versions of all packages | ||
if [ "${UPGRADE_PACKAGES}" = "true" ]; then | ||
apt-get-update-if-needed | ||
apt-get -y upgrade --no-install-recommends | ||
apt-get autoremove -y | ||
fi | ||
|
||
# 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. | ||
if [ "${LOCALE_ALREADY_SET}" != "true" ]; then | ||
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen | ||
locale-gen | ||
LOCALE_ALREADY_SET="true" | ||
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 | ||
if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then | ||
echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME | ||
chmod 0440 /etc/sudoers.d/$USERNAME | ||
EXISTING_NON_ROOT_USER="${USERNAME}" | ||
fi | ||
|
||
# .bashrc/.zshrc snippet | ||
RC_SNIPPET="$(cat << EOF | ||
export USER=\$(whoami) | ||
export PATH=\$PATH:\$HOME/.local/bin | ||
if [[ \$(which code-insiders 2>&1) && ! \$(which code 2>&1) ]]; then | ||
alias code=code-insiders | ||
fi | ||
EOF | ||
)" | ||
|
||
# Ensure ~/.local/bin is in the PATH for root and non-root users for bash. (zsh is later) | ||
if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then | ||
echo "${RC_SNIPPET}" | tee -a /root/.bashrc >> /etc/skel/.bashrc | ||
if [ "${USERNAME}" != "root" ]; then | ||
echo "${RC_SNIPPET}" >> /home/$USERNAME/.bashrc | ||
chown $USER_UID:$USER_GID /home/$USERNAME/.bashrc | ||
fi | ||
RC_SNIPPET_ALREADY_ADDED="true" | ||
fi | ||
|
||
# Optionally install and configure zsh | ||
if [ "${INSTALL_ZSH}" = "true" ] && [ ! -d "/root/.oh-my-zsh" ] && [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then | ||
apt-get-update-if-needed | ||
apt-get install -y zsh | ||
curl -fsSLo- https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh | bash 2>&1 | ||
echo -e "${RC_SNIPPET}\nDEFAULT_USER=\$USER\nprompt_context(){}" >> /root/.zshrc | ||
cp -fR /root/.oh-my-zsh /etc/skel | ||
cp -f /root/.zshrc /etc/skel | ||
sed -i -e "s/\/root\/.oh-my-zsh/\/home\/\$(whoami)\/.oh-my-zsh/g" /etc/skel/.zshrc | ||
if [ "${USERNAME}" != "root" ]; then | ||
cp -fR /etc/skel/.oh-my-zsh /etc/skel/.zshrc /home/$USERNAME | ||
chown -R $USER_UID:$USER_GID /home/$USERNAME/.oh-my-zsh /home/$USERNAME/.zshrc | ||
fi | ||
ZSH_ALREADY_INSTALLED="true" | ||
fi | ||
|
||
# Write marker file | ||
mkdir -p "$(dirname "${MARKER_FILE}")" | ||
echo -e "\ | ||
PACKAGES_ALREADY_INSTALLED=${PACKAGES_ALREADY_INSTALLED}\n\ | ||
LOCALE_ALREADY_SET=${LOCALE_ALREADY_SET}\n\ | ||
EXISTING_NON_ROOT_USER=${EXISTING_NON_ROOT_USER}\n\ | ||
RC_SNIPPET_ALREADY_ADDED=${RC_SNIPPET_ALREADY_ADDED}\n\ | ||
ZSH_ALREADY_INSTALLED=${ZSH_ALREADY_INSTALLED}" > "${MARKER_FILE}" | ||
|
||
echo "Done!" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
#!/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: ./gradle-debian.sh [gradle version] [SDKMAN_DIR] [non-root user] [Update rc files flag] | ||
|
||
GRADLE_VERSION=${1:-"lts"} | ||
export SDKMAN_DIR=${2:-"/usr/local/sdkman"} | ||
USERNAME=${3:-"vscode"} | ||
UPDATE_RC=${4:-"true"} | ||
|
||
set -e | ||
|
||
# Blank will install latest maven version | ||
if [ "${GRADLE_VERSION}" = "lts" ]; then | ||
GRADLE_VERSION="" | ||
fi | ||
|
||
if [ "$(id -u)" -ne 0 ]; then | ||
echo -e 'Script must be run a root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.' | ||
exit 1 | ||
fi | ||
|
||
# Treat a user name of "none" or non-existant user as root | ||
if [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then | ||
USERNAME=root | ||
fi | ||
|
||
function updaterc() { | ||
if [ "${UPDATE_RC}" = "true" ]; then | ||
RC_SNIPPET="$1" | ||
echo -e ${RC_SNIPPET} | tee -a /root/.bashrc /root/.zshrc >> /etc/skel/.bashrc | ||
if [ "${USERNAME}" != "root" ]; then | ||
echo -e ${RC_SNIPPET} | tee -a /home/${USERNAME}/.bashrc >> /home/${USERNAME}/.zshrc | ||
fi | ||
fi | ||
} | ||
|
||
export DEBIAN_FRONTEND=noninteractive | ||
|
||
# Install curl, zip, unzip if missing | ||
if ! dpkg -s curl ca-certificates zip unzip sed > /dev/null 2>&1; then | ||
if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then | ||
apt-get update | ||
fi | ||
apt-get -y install --no-install-recommends curl ca-certificates zip unzip sed | ||
fi | ||
|
||
# Install sdkman if not installed | ||
if [ ! -d "${SDKMAN_DIR}" ]; then | ||
curl -sSL "https://get.sdkman.io?rcupdate=false" | bash | ||
chown -R "${USERNAME}" "${SDKMAN_DIR}" | ||
# Add sourcing of sdkman into bashrc/zshrc files (unless disabled) | ||
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\nsource \${SDKMAN_DIR}/bin/sdkman-init.sh" | ||
fi | ||
|
||
# Install gradle | ||
su ${USERNAME} -c "source ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk install gradle ${GRADLE_VERSION} && sdk flush archives && sdk flush temp" | ||
updaterc "export GRADLER_USER_HOME=\${HOME}/.gradle" | ||
echo "Done!" |
Oops, something went wrong.