From 72638aa03ecbf9d1b141ec271f2c7858488254fe Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 8 Feb 2018 12:40:15 -0800 Subject: [PATCH 1/9] GUACAMOLE-407: Update Docker image to use more recent packages by switching to Ubuntu. --- Dockerfile | 121 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/Dockerfile b/Dockerfile index 21b98d8b..3e55dc1d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,9 +22,9 @@ # -# Use CentOS as base for the build -ARG CENTOS_VERSION=centos7 -FROM centos:${CENTOS_VERSION} AS builder +# Use Ubuntu as base for the build +ARG UBUNTU_VERSION=xenial +FROM ubuntu:${UBUNTU_VERSION} AS builder # Base directory for installed build artifacts. # Due to limitations of the Docker image build process, this value is @@ -37,29 +37,28 @@ ARG BUILD_DIR=/tmp/guacd-docker-BUILD ARG BUILD_DEPENDENCIES=" \ autoconf \ automake \ - cairo-devel \ - freerdp-devel \ gcc \ - libjpeg-turbo-devel \ - libssh2-devel \ + libcairo2-dev \ + libfreerdp-dev \ + libjpeg-turbo8-dev \ + libossp-uuid-dev \ + libpango1.0-dev \ + libpulse-dev \ + libssh2-1-dev \ + libssl-dev \ + libtelnet-dev \ libtool \ - libtelnet-devel \ - libvorbis-devel \ - libvncserver-devel \ - libwebp-devel \ - make \ - pango-devel \ - pulseaudio-libs-devel \ - uuid-devel" + libvncserver-dev \ + libwebp-dev \ + make" # Build time environment ENV LC_ALL=en_US.UTF-8 # Bring build environment up to date and install build dependencies -RUN yum -y update && \ - yum -y install epel-release && \ - yum -y install $BUILD_DEPENDENCIES && \ - yum clean all +RUN apt-get update && \ + apt-get install -y $BUILD_DEPENDENCIES && \ + rm -rf /var/lib/apt/lists/* # Add configuration scripts COPY src/guacd-docker/bin /opt/guacd/bin/ @@ -70,8 +69,8 @@ COPY . "$BUILD_DIR" # Build guacamole-server from local source RUN /opt/guacd/bin/build-guacd.sh "$BUILD_DIR" "$PREFIX_DIR" -# Use same CentOS as the base for the runtime image -FROM centos:${CENTOS_VERSION} +# Use same Ubuntu as the base for the runtime image +FROM ubuntu:${UBUNTU_VERSION} # Base directory for installed build artifacts. # Due to limitations of the Docker image build process, this value is @@ -85,36 +84,74 @@ ENV LC_ALL=en_US.UTF-8 ENV GUACD_LOG_LEVEL=info ARG RUNTIME_DEPENDENCIES=" \ - cairo \ - dejavu-sans-mono-fonts \ - freerdp \ - freerdp-plugins \ ghostscript \ - libjpeg-turbo \ - libssh2 \ - liberation-mono-fonts \ - libtelnet \ - libvorbis \ - libvncserver \ - libwebp \ - pango \ - pulseaudio-libs \ - terminus-fonts \ - uuid" + libcairo2 \ + fonts-liberation \ + fonts-dejavu \ + libfreerdp-cache1.1 \ + libfreerdp-client1.1 \ + libfreerdp-codec1.1 \ + libfreerdp-common1.1.0 \ + libfreerdp-core1.1 \ + libfreerdp-crypto1.1 \ + libfreerdp-gdi1.1 \ + libfreerdp-locale1.1 \ + libfreerdp-plugins-standard \ + libfreerdp-primitives1.1 \ + libfreerdp-rail1.1 \ + libfreerdp-utils1.1 \ + libjpeg-turbo8 \ + libossp-uuid16 \ + libpango1.0 \ + libpulse0 \ + libssh2-1 \ + libssl1.0.0 \ + libtelnet2 \ + libvncclient1 \ + libwebp5 \ + libwinpr-asn1-0.1 \ + libwinpr-bcrypt0.1 \ + libwinpr-credentials0.1 \ + libwinpr-credui0.1 \ + libwinpr-crt0.1 \ + libwinpr-crypto0.1 \ + libwinpr-dsparse0.1 \ + libwinpr-environment0.1 \ + libwinpr-error0.1 \ + libwinpr-file0.1 \ + libwinpr-handle0.1 \ + libwinpr-heap0.1 \ + libwinpr-input0.1 \ + libwinpr-interlocked0.1 \ + libwinpr-io0.1 \ + libwinpr-library0.1 \ + libwinpr-path0.1 \ + libwinpr-pipe0.1 \ + libwinpr-pool0.1 \ + libwinpr-registry0.1 \ + libwinpr-rpc0.1 \ + libwinpr-sspi0.1 \ + libwinpr-sspicli0.1 \ + libwinpr-synch0.1 \ + libwinpr-sysinfo0.1 \ + libwinpr-thread0.1 \ + libwinpr-timezone0.1 \ + libwinpr-utils0.1 \ + libwinpr-winhttp0.1 \ + libwinpr-winsock0.1 \ + xfonts-terminus" # Bring runtime environment up to date and install runtime dependencies -RUN yum -y update && \ - yum -y install epel-release && \ - yum -y install $RUNTIME_DEPENDENCIES && \ - yum clean all && \ - rm -rf /var/cache/yum +RUN apt-get update && \ + apt-get install -y $RUNTIME_DEPENDENCIES && \ + rm -rf /var/lib/apt/lists/* # Copy build artifacts into this stage COPY --from=builder ${PREFIX_DIR} ${PREFIX_DIR} # Link FreeRDP plugins into proper path RUN FREERDP_DIR=$(dirname \ - $(rpm -ql freerdp-libs | grep 'libfreerdp.*\.so' | head -n1)) && \ + $(dpkg-query -L libfreerdp | grep 'libfreerdp.*\.so' | head -n1)) && \ FREERDP_PLUGIN_DIR="${FREERDP_DIR}/freerdp" && \ mkdir -p "$FREERDP_PLUGIN_DIR" && \ ln -s "$PREFIX_DIR"/lib/freerdp/*.so "$FREERDP_PLUGIN_DIR" From 554d3209db73fbe70b5b4f33e1828e9251c59b7e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 8 Feb 2018 15:10:01 -0800 Subject: [PATCH 2/9] GUACAMOLE-407: Restrict runtime dependencies to only those libraries which are actually linked. --- Dockerfile | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3e55dc1d..e2e632d6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -94,11 +94,9 @@ ARG RUNTIME_DEPENDENCIES=" \ libfreerdp-common1.1.0 \ libfreerdp-core1.1 \ libfreerdp-crypto1.1 \ - libfreerdp-gdi1.1 \ libfreerdp-locale1.1 \ - libfreerdp-plugins-standard \ libfreerdp-primitives1.1 \ - libfreerdp-rail1.1 \ + libfreerdp-plugins-standard \ libfreerdp-utils1.1 \ libjpeg-turbo8 \ libossp-uuid16 \ @@ -109,36 +107,24 @@ ARG RUNTIME_DEPENDENCIES=" \ libtelnet2 \ libvncclient1 \ libwebp5 \ - libwinpr-asn1-0.1 \ - libwinpr-bcrypt0.1 \ - libwinpr-credentials0.1 \ - libwinpr-credui0.1 \ libwinpr-crt0.1 \ - libwinpr-crypto0.1 \ libwinpr-dsparse0.1 \ libwinpr-environment0.1 \ - libwinpr-error0.1 \ libwinpr-file0.1 \ libwinpr-handle0.1 \ libwinpr-heap0.1 \ libwinpr-input0.1 \ libwinpr-interlocked0.1 \ - libwinpr-io0.1 \ libwinpr-library0.1 \ libwinpr-path0.1 \ - libwinpr-pipe0.1 \ libwinpr-pool0.1 \ libwinpr-registry0.1 \ libwinpr-rpc0.1 \ libwinpr-sspi0.1 \ - libwinpr-sspicli0.1 \ libwinpr-synch0.1 \ libwinpr-sysinfo0.1 \ libwinpr-thread0.1 \ - libwinpr-timezone0.1 \ libwinpr-utils0.1 \ - libwinpr-winhttp0.1 \ - libwinpr-winsock0.1 \ xfonts-terminus" # Bring runtime environment up to date and install runtime dependencies @@ -151,7 +137,7 @@ COPY --from=builder ${PREFIX_DIR} ${PREFIX_DIR} # Link FreeRDP plugins into proper path RUN FREERDP_DIR=$(dirname \ - $(dpkg-query -L libfreerdp | grep 'libfreerdp.*\.so' | head -n1)) && \ + $(dpkg-query -L libfreerdp-client1.1 | grep 'libfreerdp.*\.so' | head -n1)) && \ FREERDP_PLUGIN_DIR="${FREERDP_DIR}/freerdp" && \ mkdir -p "$FREERDP_PLUGIN_DIR" && \ ln -s "$PREFIX_DIR"/lib/freerdp/*.so "$FREERDP_PLUGIN_DIR" From d6510360d03118ffaf37967678fa35c5bf412da5 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 8 Feb 2018 16:29:07 -0800 Subject: [PATCH 3/9] GUACAMOLE-407: Dynamically derive runtime dependencies. --- Dockerfile | 68 ++++------------ src/guacd-docker/bin/link-freerdp-plugins.sh | 86 ++++++++++++++++++++ src/guacd-docker/bin/list-dependencies.sh | 48 +++++++++++ 3 files changed, 152 insertions(+), 50 deletions(-) create mode 100755 src/guacd-docker/bin/link-freerdp-plugins.sh create mode 100755 src/guacd-docker/bin/list-dependencies.sh diff --git a/Dockerfile b/Dockerfile index e2e632d6..79c884f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,13 +61,20 @@ RUN apt-get update && \ rm -rf /var/lib/apt/lists/* # Add configuration scripts -COPY src/guacd-docker/bin /opt/guacd/bin/ +COPY src/guacd-docker/bin "${PREFIX_DIR}/bin/" # Copy source to container for sake of build COPY . "$BUILD_DIR" # Build guacamole-server from local source -RUN /opt/guacd/bin/build-guacd.sh "$BUILD_DIR" "$PREFIX_DIR" +RUN ${PREFIX_DIR}/bin/build-guacd.sh "$BUILD_DIR" "$PREFIX_DIR" + +# Record the packages of all runtime library dependencies +RUN ${PREFIX_DIR}/bin/list-dependencies.sh \ + ${PREFIX_DIR}/sbin/guacd \ + ${PREFIX_DIR}/lib/libguac-client-*.so \ + ${PREFIX_DIR}/lib/freerdp/guac*.so \ + > ${PREFIX_DIR}/DEPENDENCIES # Use same Ubuntu as the base for the runtime image FROM ubuntu:${UBUNTU_VERSION} @@ -85,62 +92,23 @@ ENV GUACD_LOG_LEVEL=info ARG RUNTIME_DEPENDENCIES=" \ ghostscript \ - libcairo2 \ + libfreerdp-plugins-standard \ fonts-liberation \ fonts-dejavu \ - libfreerdp-cache1.1 \ - libfreerdp-client1.1 \ - libfreerdp-codec1.1 \ - libfreerdp-common1.1.0 \ - libfreerdp-core1.1 \ - libfreerdp-crypto1.1 \ - libfreerdp-locale1.1 \ - libfreerdp-primitives1.1 \ - libfreerdp-plugins-standard \ - libfreerdp-utils1.1 \ - libjpeg-turbo8 \ - libossp-uuid16 \ - libpango1.0 \ - libpulse0 \ - libssh2-1 \ - libssl1.0.0 \ - libtelnet2 \ - libvncclient1 \ - libwebp5 \ - libwinpr-crt0.1 \ - libwinpr-dsparse0.1 \ - libwinpr-environment0.1 \ - libwinpr-file0.1 \ - libwinpr-handle0.1 \ - libwinpr-heap0.1 \ - libwinpr-input0.1 \ - libwinpr-interlocked0.1 \ - libwinpr-library0.1 \ - libwinpr-path0.1 \ - libwinpr-pool0.1 \ - libwinpr-registry0.1 \ - libwinpr-rpc0.1 \ - libwinpr-sspi0.1 \ - libwinpr-synch0.1 \ - libwinpr-sysinfo0.1 \ - libwinpr-thread0.1 \ - libwinpr-utils0.1 \ xfonts-terminus" -# Bring runtime environment up to date and install runtime dependencies -RUN apt-get update && \ - apt-get install -y $RUNTIME_DEPENDENCIES && \ - rm -rf /var/lib/apt/lists/* - # Copy build artifacts into this stage COPY --from=builder ${PREFIX_DIR} ${PREFIX_DIR} +# Bring runtime environment up to date and install runtime dependencies +RUN apt-get update && \ + apt-get install -y $RUNTIME_DEPENDENCIES && \ + apt-get install -y $(cat "${PREFIX_DIR}"/DEPENDENCIES) && \ + rm -rf /var/lib/apt/lists/* + # Link FreeRDP plugins into proper path -RUN FREERDP_DIR=$(dirname \ - $(dpkg-query -L libfreerdp-client1.1 | grep 'libfreerdp.*\.so' | head -n1)) && \ - FREERDP_PLUGIN_DIR="${FREERDP_DIR}/freerdp" && \ - mkdir -p "$FREERDP_PLUGIN_DIR" && \ - ln -s "$PREFIX_DIR"/lib/freerdp/*.so "$FREERDP_PLUGIN_DIR" +RUN ${PREFIX_DIR}/bin/link-freerdp-plugins.sh \ + ${PREFIX_DIR}/lib/freerdp/guac*.so # Expose the default listener port EXPOSE 4822 diff --git a/src/guacd-docker/bin/link-freerdp-plugins.sh b/src/guacd-docker/bin/link-freerdp-plugins.sh new file mode 100755 index 00000000..332d4c0f --- /dev/null +++ b/src/guacd-docker/bin/link-freerdp-plugins.sh @@ -0,0 +1,86 @@ +#!/bin/sh -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn link-freerdp-plugins.sh +## +## Automatically creates any required symbolic links for the proper loading of +## the given FreeRDP plugins. If a given plugin is already in the correct +## directory, no link is created for that plugin. +## +## @param ... +## The FreeRDP plugins to add links for. +## + +## +## Given the full path to a FreeRDP plugin, locates the base directory of the +## associated FreeRDP installation (where the FreeRDP library .so files are +## located), printing the result to STDOUT. If the directory cannot be +## determined, an error is printed. +## +## @param PLUGIN_FILE +## The full path to the FreeRDP plugin to check. +## +where_is_freerdp() { + + PLUGIN_FILE="$1" + + # Determine the location of all libfreerdp* libraries explicitly linked + # to given file + PATHS="$(ldd "$PLUGIN_FILE" \ + | awk '/=>/{print $(NF-1)}' \ + | grep 'libfreerdp' \ + | xargs -r dirname \ + | xargs -r realpath \ + | sort -u)" + + # Verify that exactly one location was found + if [ "$(echo "$PATHS" | wc -l)" != 1 ]; then + echo "$1: Unable to locate FreeRDP install location." >&2 + return 1 + fi + + echo "$PATHS" + +} + +# +# Create symbolic links as necessary to include all given plugins within the +# search path of FreeRDP +# + +while [ -n "$1" ]; do + + # Determine correct install location for FreeRDP plugins + FREERDP_DIR="$(where_is_freerdp "$1")" + FREERDP_PLUGIN_DIR="${FREERDP_DIR}/freerdp" + + # Add symbolic link if necessary + if [ ! -e "$FREERDP_PLUGIN_DIR/$(basename "$1")" ]; then + mkdir -p "$FREERDP_PLUGIN_DIR" + ln -s "$1" "$FREERDP_PLUGIN_DIR" + else + echo "$1: Already in correct directory." >&2 + fi + + shift + +done + diff --git a/src/guacd-docker/bin/list-dependencies.sh b/src/guacd-docker/bin/list-dependencies.sh new file mode 100755 index 00000000..090185e4 --- /dev/null +++ b/src/guacd-docker/bin/list-dependencies.sh @@ -0,0 +1,48 @@ +#!/bin/sh -e +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +## +## @fn list-dependencies.sh +## +## Lists the Debian/Ubuntu package names for all library dependencies of the +## given binaries. Each package is only listed once, even if multiple binaries +## provided by the same package are given. +## +## @param ... +## The full paths to all binaries being checked. +## + +while [ -n "$1" ]; do + + # For all non-Guacamole library dependencies + ldd "$1" | grep -v 'libguac' | awk '/=>/{print $(NF-1)}' \ + | while read LIBRARY; do + + # Determine the Debian package which is associated with that + # library, if any + dpkg-query -S "$LIBRARY" 2> /dev/null || true + + done + + # Next binary + shift + +done | cut -f1 -d: | sort -u + From 2e4fb5b91c95ceb5db75b74abc548b5c9d37a9d1 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 8 Feb 2018 19:47:30 -0800 Subject: [PATCH 4/9] GUACAMOLE-407: Upgrade Docker image to Ubuntu 17.10. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 79c884f7..a456b37a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ # Use Ubuntu as base for the build -ARG UBUNTU_VERSION=xenial +ARG UBUNTU_VERSION=artful FROM ubuntu:${UBUNTU_VERSION} AS builder # Base directory for installed build artifacts. From eb282e49d96c9398908147285744483c52447d1e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2018 21:24:50 -0700 Subject: [PATCH 5/9] GUACAMOLE-407: Use Debian (stable) instead of Ubuntu. --- Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index a456b37a..ef9e0334 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,9 +22,9 @@ # -# Use Ubuntu as base for the build -ARG UBUNTU_VERSION=artful -FROM ubuntu:${UBUNTU_VERSION} AS builder +# Use Debian as base for the build +ARG DEBIAN_VERSION=stable +FROM debian:${DEBIAN_VERSION} AS builder # Base directory for installed build artifacts. # Due to limitations of the Docker image build process, this value is @@ -40,7 +40,7 @@ ARG BUILD_DEPENDENCIES=" \ gcc \ libcairo2-dev \ libfreerdp-dev \ - libjpeg-turbo8-dev \ + libjpeg62-turbo-dev \ libossp-uuid-dev \ libpango1.0-dev \ libpulse-dev \ @@ -76,8 +76,8 @@ RUN ${PREFIX_DIR}/bin/list-dependencies.sh \ ${PREFIX_DIR}/lib/freerdp/guac*.so \ > ${PREFIX_DIR}/DEPENDENCIES -# Use same Ubuntu as the base for the runtime image -FROM ubuntu:${UBUNTU_VERSION} +# Use same Debian as the base for the runtime image +FROM debian:${DEBIAN_VERSION} # Base directory for installed build artifacts. # Due to limitations of the Docker image build process, this value is From 14389326b468a16a8cdc3cb034f4a7e6d6b6c1c7 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2018 21:31:44 -0700 Subject: [PATCH 6/9] GUACAMOLE-407: Remove unnecessary setting of LC_ALL within build (only needed at runtime). --- Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index ef9e0334..120ba887 100644 --- a/Dockerfile +++ b/Dockerfile @@ -52,9 +52,6 @@ ARG BUILD_DEPENDENCIES=" \ libwebp-dev \ make" -# Build time environment -ENV LC_ALL=en_US.UTF-8 - # Bring build environment up to date and install build dependencies RUN apt-get update && \ apt-get install -y $BUILD_DEPENDENCIES && \ From 1f60526ab878666763463149a9aa9baa06908539 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2018 21:36:59 -0700 Subject: [PATCH 7/9] GUACAMOLE-407: Do not build guaclog within guacd Docker image. The guacd image should contain only guacd. --- src/guacd-docker/bin/build-guacd.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/guacd-docker/bin/build-guacd.sh b/src/guacd-docker/bin/build-guacd.sh index 9e8c3a3f..47147438 100755 --- a/src/guacd-docker/bin/build-guacd.sh +++ b/src/guacd-docker/bin/build-guacd.sh @@ -43,7 +43,7 @@ PREFIX_DIR="$2" cd "$BUILD_DIR" autoreconf -fi -./configure --prefix="$PREFIX_DIR" +./configure --prefix="$PREFIX_DIR" --disable-guaclog make make install ldconfig From b3c1471180a14d2e66bf2966c21fcec0b37edeaa Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2018 21:50:41 -0700 Subject: [PATCH 8/9] GUACAMOLE-407: Explicitly set LD_LIBRARY_PATH such that linker can find guacd's protocol plugins. --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 120ba887..dc587652 100644 --- a/Dockerfile +++ b/Dockerfile @@ -85,6 +85,7 @@ ARG PREFIX_DIR=/usr/local/guacamole # Runtime environment ENV LC_ALL=en_US.UTF-8 +ENV LD_LIBRARY_PATH=${PREFIX_DIR}/lib ENV GUACD_LOG_LEVEL=info ARG RUNTIME_DEPENDENCIES=" \ From 0126880dad7b5a197ae2af4b15dc1866c48bd24e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2018 22:05:06 -0700 Subject: [PATCH 9/9] GUACAMOLE-407: As the Docker base image lacks the "en_US" locale, we must instead use "C.UTF-8" to ensure characters render correctly. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index dc587652..4d463a38 100644 --- a/Dockerfile +++ b/Dockerfile @@ -84,7 +84,7 @@ FROM debian:${DEBIAN_VERSION} ARG PREFIX_DIR=/usr/local/guacamole # Runtime environment -ENV LC_ALL=en_US.UTF-8 +ENV LC_ALL=C.UTF-8 ENV LD_LIBRARY_PATH=${PREFIX_DIR}/lib ENV GUACD_LOG_LEVEL=info