Dockerfile.guacd 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. #
  2. # Licensed to the Apache Software Foundation (ASF) under one
  3. # or more contributor license agreements. See the NOTICE file
  4. # distributed with this work for additional information
  5. # regarding copyright ownership. The ASF licenses this file
  6. # to you under the Apache License, Version 2.0 (the
  7. # "License"); you may not use this file except in compliance
  8. # with the License. You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing,
  13. # software distributed under the License is distributed on an
  14. # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. # KIND, either express or implied. See the License for the
  16. # specific language governing permissions and limitations
  17. # under the License.
  18. #
  19. #
  20. # Dockerfile for guacamole-server
  21. #
  22. # The Alpine Linux image that should be used as the basis for the guacd image
  23. ARG ALPINE_BASE_IMAGE=3.22.2
  24. # The target architecture of the build. Valid values are "ARM" and "X86". By
  25. # default, this is detected automatically.
  26. ARG BUILD_ARCHITECTURE
  27. # The number of processes that may run simultaneously during the build. By
  28. # default, this is detected automatically.
  29. ARG BUILD_JOBS
  30. # The directory that will house the guacamole-server source during the build
  31. ARG BUILD_DIR=/tmp/guacamole-server
  32. # FreeRDP version (default to version 2)
  33. ARG FREERDP_VERSION=2
  34. # The final install location for guacamole-server and all dependencies. NOTE:
  35. # This value is hard-coded in the entrypoint. Any change to this value must be
  36. # propagated there.
  37. ARG PREFIX_DIR=/opt/guacamole
  38. #
  39. # Automatically select the latest versions of each core protocol support
  40. # library (these can be overridden at build time if a specific version is
  41. # needed)
  42. #
  43. ARG WITH_FREERDP="${FREERDP_VERSION}(\.\d+)+"
  44. ARG WITH_LIBSSH2='libssh2-\d+(\.\d+)+'
  45. ARG WITH_LIBTELNET='\d+(\.\d+)+'
  46. ARG WITH_LIBVNCCLIENT='LibVNCServer-\d+(\.\d+)+'
  47. ARG WITH_LIBWEBSOCKETS='v\d+(\.\d+)+'
  48. ARG WITH_GUACAMOLE_SERVER='\d+(\.\d+)+'
  49. #
  50. # Default build options for each core protocol support library, as well as
  51. # guacamole-server itself (these can be overridden at build time if different
  52. # options are needed)
  53. #
  54. ARG FREERDP_ARM_OPTS=""
  55. ARG FREERDP_OPTS="\
  56. -DBUILTIN_CHANNELS=OFF \
  57. -DCHANNEL_URBDRC=OFF \
  58. -DWITH_ALSA=OFF \
  59. -DWITH_CAIRO=ON \
  60. -DWITH_CHANNELS=ON \
  61. -DWITH_CLIENT=ON \
  62. -DWITH_CUPS=OFF \
  63. -DWITH_DIRECTFB=OFF \
  64. -DWITH_FFMPEG=OFF \
  65. -DWITH_FUSE=OFF \
  66. -DWITH_GSM=OFF \
  67. -DWITH_GSSAPI=OFF \
  68. -DWITH_IPP=OFF \
  69. -DWITH_JPEG=ON \
  70. -DWITH_KRB5=ON \
  71. -DWITH_LIBSYSTEMD=OFF \
  72. -DWITH_MANPAGES=OFF \
  73. -DWITH_OPENH264=OFF \
  74. -DWITH_OPENSSL=ON \
  75. -DWITH_OSS=OFF \
  76. -DWITH_PCSC=OFF \
  77. -DWITH_PKCS11=OFF \
  78. -DWITH_PULSE=OFF \
  79. -DWITH_SERVER=OFF \
  80. -DWITH_SERVER_INTERFACE=OFF \
  81. -DWITH_SHADOW_MAC=OFF \
  82. -DWITH_SHADOW_X11=OFF \
  83. -DWITH_SWSCALE=OFF \
  84. -DWITH_WAYLAND=OFF \
  85. -DWITH_X11=OFF \
  86. -DWITH_X264=OFF \
  87. -DWITH_XCURSOR=ON \
  88. -DWITH_XEXT=ON \
  89. -DWITH_XI=OFF \
  90. -DWITH_XINERAMA=OFF \
  91. -DWITH_XKBFILE=ON \
  92. -DWITH_XRENDER=OFF \
  93. -DWITH_XTEST=OFF \
  94. -DWITH_XV=OFF \
  95. -DCMAKE_CXX_FLAGS=-Wno-incompatible-pointer-types \
  96. -DCMAKE_C_FLAGS=-Wno-incompatible-pointer-types \
  97. -DWITH_ZLIB=ON"
  98. ARG FREERDP_X86_OPTS=""
  99. ARG GUACAMOLE_SERVER_ARM_OPTS=""
  100. ARG GUACAMOLE_SERVER_OPTS="\
  101. --disable-guaclog \
  102. CPPFLAGS=-Wno-error=deprecated-declarations"
  103. ARG GUACAMOLE_SERVER_X86_OPTS=""
  104. ARG GUACAMOLE_SERVER_UNKNOWN_OPTS=""
  105. ARG LIBSSH2_ARM_OPTS=""
  106. ARG LIBSSH2_OPTS="\
  107. -DBUILD_EXAMPLES=OFF \
  108. -DBUILD_SHARED_LIBS=ON"
  109. ARG LIBSSH2_X86_OPTS=""
  110. ARG LIBTELNET_ARM_OPTS=""
  111. ARG LIBTELNET_OPTS="\
  112. --disable-static \
  113. --disable-util"
  114. ARG LIBTELNET_X86_OPTS=""
  115. ARG LIBVNCCLIENT_ARM_OPTS=""
  116. ARG LIBVNCCLIENT_OPTS=""
  117. ARG LIBVNCCLIENT_X86_OPTS=""
  118. ARG LIBWEBSOCKETS_ARM_OPTS=""
  119. ARG LIBWEBSOCKETS_OPTS="\
  120. -DDISABLE_WERROR=ON \
  121. -DLWS_WITHOUT_SERVER=ON \
  122. -DLWS_WITHOUT_TESTAPPS=ON \
  123. -DLWS_WITHOUT_TEST_CLIENT=ON \
  124. -DLWS_WITHOUT_TEST_PING=ON \
  125. -DLWS_WITHOUT_TEST_SERVER=ON \
  126. -DLWS_WITHOUT_TEST_SERVER_EXTPOLL=ON \
  127. -DLWS_WITH_STATIC=OFF"
  128. ARG LIBWEBSOCKETS_X86_OPTS=""
  129. #
  130. # Base builder image that will be used by subsequent build stages, including
  131. # for building dependencies of guacamole-server.
  132. #
  133. FROM alpine:${ALPINE_BASE_IMAGE} AS builder
  134. ARG BUILD_DIR
  135. RUN sed -i 's!https://dl-cdn.alpinelinux.org/!https://mirrors.ustc.edu.cn/!g' /etc/apk/repositories
  136. # Install build dependencies
  137. RUN apk add \
  138. autoconf \
  139. automake \
  140. build-base \
  141. cairo-dev \
  142. cjson-dev \
  143. cmake \
  144. cunit-dev \
  145. git \
  146. grep \
  147. krb5-dev \
  148. libjpeg-turbo-dev \
  149. libpng-dev \
  150. libtool \
  151. libwebp-dev \
  152. make \
  153. openssl-dev \
  154. pango-dev \
  155. pulseaudio-dev \
  156. sdl2-dev \
  157. sdl2_ttf-dev \
  158. util-linux-dev
  159. ARG GUAC_VER=1.6.0
  160. RUN git clone --branch=${GUAC_VER} https://github.com/apache/guacamole-server.git ${BUILD_DIR}
  161. #
  162. # Build dependency: libssh2
  163. #
  164. FROM builder AS libssh2
  165. ARG BUILD_DIR
  166. ARG LIBSSH2_ARM_OPTS
  167. ARG LIBSSH2_OPTS
  168. ARG LIBSSH2_X86_OPTS
  169. ARG PREFIX_DIR
  170. ARG WITH_LIBSSH2
  171. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "LIBSSH2" \
  172. "https://github.com/libssh2/libssh2"
  173. #
  174. # Build dependency: libtelnet
  175. #
  176. FROM builder AS libtelnet
  177. ARG BUILD_DIR
  178. ARG LIBTELNET_ARM_OPTS
  179. ARG LIBTELNET_OPTS
  180. ARG LIBTELNET_X86_OPTS
  181. ARG PREFIX_DIR
  182. ARG WITH_LIBTELNET
  183. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "LIBTELNET" \
  184. "https://github.com/seanmiddleditch/libtelnet"
  185. #
  186. # Build dependency: libvncclient
  187. #
  188. FROM builder AS libvncclient
  189. ARG BUILD_DIR
  190. ARG LIBVNCCLIENT_ARM_OPTS
  191. ARG LIBVNCCLIENT_OPTS
  192. ARG LIBVNCCLIENT_X86_OPTS
  193. ARG PREFIX_DIR
  194. ARG WITH_LIBVNCCLIENT
  195. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "LIBVNCCLIENT" \
  196. "https://github.com/LibVNC/libvncserver"
  197. #
  198. # Build dependency: libwebsockets
  199. #
  200. FROM builder AS libwebsockets
  201. ARG BUILD_DIR
  202. ARG LIBWEBSOCKETS_ARM_OPTS
  203. ARG LIBWEBSOCKETS_OPTS
  204. ARG LIBWEBSOCKETS_X86_OPTS
  205. ARG PREFIX_DIR
  206. ARG WITH_LIBWEBSOCKETS
  207. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "LIBWEBSOCKETS" \
  208. "https://github.com/warmcat/libwebsockets"
  209. #
  210. # Build dependency: FreeRDP
  211. #
  212. FROM builder AS freerdp
  213. ARG BUILD_DIR
  214. ARG FREERDP_ARM_OPTS
  215. ARG FREERDP_OPTS
  216. ARG FREERDP_X86_OPTS
  217. ARG PREFIX_DIR
  218. ARG WITH_FREERDP
  219. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "FREERDP" \
  220. "https://github.com/FreeRDP/FreeRDP"
  221. #
  222. # STAGE 7: Collect dependencies built by previous stages and build
  223. # guacamole-server.
  224. #
  225. FROM builder AS guacamole-server
  226. ARG BUILD_DIR
  227. ARG FREERDP_VERSION
  228. ARG GUACAMOLE_SERVER_ARM_OPTS
  229. ARG GUACAMOLE_SERVER_UNKNOWN_OPTS
  230. ARG GUACAMOLE_SERVER_OPTS
  231. ARG GUACAMOLE_SERVER_X86_OPTS
  232. ARG PREFIX_DIR
  233. ARG WITH_GUACAMOLE_SERVER
  234. # Copy dependencies built in previous stages
  235. COPY --from=freerdp ${PREFIX_DIR} ${PREFIX_DIR}
  236. COPY --from=libssh2 ${PREFIX_DIR} ${PREFIX_DIR}
  237. COPY --from=libtelnet ${PREFIX_DIR} ${PREFIX_DIR}
  238. COPY --from=libvncclient ${PREFIX_DIR} ${PREFIX_DIR}
  239. COPY --from=libwebsockets ${PREFIX_DIR} ${PREFIX_DIR}
  240. # Use guacamole-server source from build context
  241. COPY --from=builder ${BUILD_DIR} ${BUILD_DIR}
  242. RUN ${BUILD_DIR}/src/guacd-docker/bin/autobuild.sh "GUACAMOLE_SERVER" "${BUILD_DIR}"
  243. # Determine location of the FREERDP library based on the version.
  244. ARG FREERDP_LIB_PATH=${PREFIX_DIR}/lib/freerdp${FREERDP_VERSION}
  245. # Record the packages of all runtime library dependencies
  246. RUN ${BUILD_DIR}/src/guacd-docker/bin/list-dependencies.sh \
  247. ${PREFIX_DIR}/sbin/guacd \
  248. ${PREFIX_DIR}/lib/libguac-client-*.so \
  249. ${FREERDP_LIB_PATH}/*guac*.so \
  250. > ${PREFIX_DIR}/DEPENDENCIES
  251. #
  252. # STAGE 8: Final, runtime image.
  253. #
  254. # Use same Alpine version as the base for the runtime image
  255. FROM alpine:${ALPINE_BASE_IMAGE} AS runtime
  256. ARG PREFIX_DIR
  257. ARG BUILD_DIR
  258. # Copy build artifacts into this stage
  259. COPY --from=guacamole-server ${PREFIX_DIR} ${PREFIX_DIR}
  260. RUN sed -i 's!https://dl-cdn.alpinelinux.org/!https://mirrors.ustc.edu.cn/!g' /etc/apk/repositories
  261. RUN cat ${PREFIX_DIR}/DEPENDENCIES
  262. # Bring runtime environment up to date and install runtime dependencies
  263. RUN apk add --no-cache \
  264. ca-certificates \
  265. font-noto-cjk \
  266. ghostscript \
  267. netcat-openbsd \
  268. shadow \
  269. terminus-font \
  270. ttf-dejavu \
  271. ttf-liberation \
  272. util-linux-login && \
  273. xargs apk add --no-cache < ${PREFIX_DIR}/DEPENDENCIES
  274. # Runtime environment
  275. ENV LC_ALL=C.UTF-8
  276. ENV LD_LIBRARY_PATH=${PREFIX_DIR}/lib
  277. # Checks the operating status every 5 minutes with a timeout of 5 seconds
  278. HEALTHCHECK --interval=5m --timeout=5s CMD nc -z 127.0.0.1 4822 || exit 1
  279. # Create a new user guacd
  280. ARG UID=1000
  281. ARG GID=1000
  282. RUN groupadd --gid $GID guacd
  283. RUN useradd --system --create-home --shell /sbin/nologin --uid $UID --gid $GID guacd
  284. # Run with user guacd
  285. USER guacd
  286. # Expose the default listener port
  287. EXPOSE 4822
  288. COPY --from=guacamole-server ${BUILD_DIR}/src/guacd-docker/bin/entrypoint.sh /opt/guacamole/
  289. #COPY
  290. ENTRYPOINT [ "/opt/guacamole/entrypoint.sh" ]