Dockerfile.base 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. FROM nginx:1.22
  2. # ensure local python is preferred over distribution python
  3. ENV PATH /usr/local/bin:$PATH
  4. # http://bugs.python.org/issue19846
  5. # > At the moment, setting "LANG=C" on a Linux system *fundamentally breaks Python 3*, and that's not OK.
  6. ENV LANG C.UTF-8
  7. # runtime dependencies
  8. RUN set -eux; \
  9. apt-get update; \
  10. apt-get install -y --no-install-recommends \
  11. ca-certificates \
  12. netbase \
  13. tzdata \
  14. ; \
  15. rm -rf /var/lib/apt/lists/*
  16. ENV GPG_KEY A035C8C19219BA821ECEA86B64E628F8D684696D
  17. ENV PYTHON_VERSION 3.10.10
  18. RUN set -eux; \
  19. \
  20. savedAptMark="$(apt-mark showmanual)"; \
  21. apt-get update; \
  22. apt-get install -y --no-install-recommends \
  23. dpkg-dev \
  24. gcc \
  25. gnupg dirmngr \
  26. libbluetooth-dev \
  27. libbz2-dev \
  28. libc6-dev \
  29. libdb-dev \
  30. libexpat1-dev \
  31. libffi-dev \
  32. libgdbm-dev \
  33. liblzma-dev \
  34. libncursesw5-dev \
  35. libreadline-dev \
  36. libsqlite3-dev \
  37. libssl-dev \
  38. make \
  39. tk-dev \
  40. uuid-dev \
  41. wget \
  42. xz-utils \
  43. zlib1g-dev \
  44. ; \
  45. \
  46. wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; \
  47. wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; \
  48. GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; \
  49. gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; \
  50. gpg --batch --verify python.tar.xz.asc python.tar.xz; \
  51. command -v gpgconf > /dev/null && gpgconf --kill all || :; \
  52. rm -rf "$GNUPGHOME" python.tar.xz.asc; \
  53. mkdir -p /usr/src/python; \
  54. tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; \
  55. rm python.tar.xz; \
  56. \
  57. cd /usr/src/python; \
  58. gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
  59. ./configure \
  60. --build="$gnuArch" \
  61. --enable-loadable-sqlite-extensions \
  62. --enable-optimizations \
  63. --enable-option-checking=fatal \
  64. --enable-shared \
  65. --with-lto \
  66. --with-system-expat \
  67. --without-ensurepip \
  68. ; \
  69. nproc="$(nproc)"; \
  70. EXTRA_CFLAGS="$(dpkg-buildflags --get CFLAGS)"; \
  71. LDFLAGS="$(dpkg-buildflags --get LDFLAGS)"; \
  72. LDFLAGS="${LDFLAGS:--Wl},--strip-all"; \
  73. make -j "$nproc" \
  74. "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
  75. "LDFLAGS=${LDFLAGS:-}" \
  76. "PROFILE_TASK=${PROFILE_TASK:-}" \
  77. ; \
  78. # https://github.com/docker-library/python/issues/784
  79. # prevent accidental usage of a system installed libpython of the same version
  80. rm python; \
  81. make -j "$nproc" \
  82. "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" \
  83. "LDFLAGS=${LDFLAGS:--Wl},-rpath='\$\$ORIGIN/../lib'" \
  84. "PROFILE_TASK=${PROFILE_TASK:-}" \
  85. python \
  86. ; \
  87. make install; \
  88. \
  89. cd /; \
  90. rm -rf /usr/src/python; \
  91. \
  92. find /usr/local -depth \
  93. \( \
  94. \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) \
  95. -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \
  96. \) -exec rm -rf '{}' + \
  97. ; \
  98. \
  99. ldconfig; \
  100. \
  101. apt-mark auto '.*' > /dev/null; \
  102. apt-mark manual $savedAptMark; \
  103. find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' \
  104. | awk '/=>/ { print $(NF-1) }' \
  105. | sort -u \
  106. | xargs -r dpkg-query --search \
  107. | cut -d: -f1 \
  108. | sort -u \
  109. | xargs -r apt-mark manual \
  110. ; \
  111. rm -rf /var/lib/apt/lists/*; \
  112. \
  113. python3 --version
  114. # make some useful symlinks that are expected to exist ("/usr/local/bin/python" and friends)
  115. RUN set -eux; \
  116. for src in idle3 pydoc3 python3 python3-config; do \
  117. dst="$(echo "$src" | tr -d 3)"; \
  118. [ -s "/usr/local/bin/$src" ]; \
  119. [ ! -e "/usr/local/bin/$dst" ]; \
  120. ln -svT "$src" "/usr/local/bin/$dst"; \
  121. done
  122. # if this is called "PIP_VERSION", pip explodes with "ValueError: invalid truth value '<VERSION>'"
  123. ENV PYTHON_PIP_VERSION 22.3.1
  124. # https://github.com/docker-library/python/issues/365
  125. ENV PYTHON_SETUPTOOLS_VERSION 65.5.1
  126. # https://github.com/pypa/get-pip
  127. ENV PYTHON_GET_PIP_URL https://github.com/pypa/get-pip/raw/d5cb0afaf23b8520f1bbcfed521017b4a95f5c01/public/get-pip.py
  128. ENV PYTHON_GET_PIP_SHA256 394be00f13fa1b9aaa47e911bdb59a09c3b2986472130f30aa0bfaf7f3980637
  129. RUN set -eux; \
  130. \
  131. savedAptMark="$(apt-mark showmanual)"; \
  132. apt-get update; \
  133. apt-get install -y --no-install-recommends wget; \
  134. \
  135. wget -O get-pip.py "$PYTHON_GET_PIP_URL"; \
  136. echo "$PYTHON_GET_PIP_SHA256 *get-pip.py" | sha256sum -c -; \
  137. \
  138. apt-mark auto '.*' > /dev/null; \
  139. [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \
  140. rm -rf /var/lib/apt/lists/*; \
  141. \
  142. export PYTHONDONTWRITEBYTECODE=1; \
  143. \
  144. python get-pip.py \
  145. --disable-pip-version-check \
  146. --no-cache-dir \
  147. --no-compile \
  148. "pip==$PYTHON_PIP_VERSION" \
  149. "setuptools==$PYTHON_SETUPTOOLS_VERSION" \
  150. ; \
  151. rm -f get-pip.py; \
  152. \
  153. pip --version
  154. RUN groupadd --gid 1000 node \
  155. && useradd --uid 1000 --gid node --shell /bin/bash --create-home node
  156. ENV NODE_VERSION 18.15.0
  157. RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \
  158. && case "${dpkgArch##*-}" in \
  159. amd64) ARCH='x64';; \
  160. ppc64el) ARCH='ppc64le';; \
  161. s390x) ARCH='s390x';; \
  162. arm64) ARCH='arm64';; \
  163. armhf) ARCH='armv7l';; \
  164. i386) ARCH='x86';; \
  165. *) echo "unsupported architecture"; exit 1 ;; \
  166. esac \
  167. && set -ex \
  168. # libatomic1 for arm
  169. && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr xz-utils libatomic1 --no-install-recommends \
  170. && rm -rf /var/lib/apt/lists/* \
  171. && for key in \
  172. 4ED778F539E3634C779C87C6D7062848A1AB005C \
  173. 141F07595B7B3FFE74309A937405533BE57C7D57 \
  174. 74F12602B6F1C4E913FAA37AD3A89613643B6201 \
  175. DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \
  176. 61FC681DFB92A079F1685E77973F295594EC4689 \
  177. 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
  178. C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
  179. 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \
  180. C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \
  181. 108F52B48DB57BB0CC439B2997B01419BD92F80A \
  182. ; do \
  183. gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \
  184. gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
  185. done \
  186. && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \
  187. && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
  188. && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
  189. && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
  190. && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
  191. && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \
  192. && apt-mark auto '.*' > /dev/null \
  193. && find /usr/local -type f -executable -exec ldd '{}' ';' \
  194. | awk '/=>/ { print $(NF-1) }' \
  195. | sort -u \
  196. | xargs -r dpkg-query --search \
  197. | cut -d: -f1 \
  198. | sort -u \
  199. | xargs -r apt-mark manual \
  200. && ln -s /usr/local/bin/node /usr/local/bin/nodejs \
  201. # smoke tests
  202. && node --version \
  203. && npm --version
  204. ENV YARN_VERSION 1.22.19
  205. RUN set -ex \
  206. && savedAptMark="$(apt-mark showmanual)" \
  207. && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr --no-install-recommends \
  208. && rm -rf /var/lib/apt/lists/* \
  209. && for key in \
  210. 6A010C5166006599AA17F08146C2130DFD2497F5 \
  211. ; do \
  212. gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \
  213. gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
  214. done \
  215. && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
  216. && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \
  217. && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
  218. && mkdir -p /opt \
  219. && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
  220. && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
  221. && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \
  222. && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
  223. && apt-mark auto '.*' > /dev/null \
  224. && { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; } \
  225. && find /usr/local -type f -executable -exec ldd '{}' ';' \
  226. | awk '/=>/ { print $(NF-1) }' \
  227. | sort -u \
  228. | xargs -r dpkg-query --search \
  229. | cut -d: -f1 \
  230. | sort -u \
  231. | xargs -r apt-mark manual \
  232. # smoke test
  233. && yarn --version
  234. RUN apt-get update && \
  235. apt-get install -y bash curl wget vim gcc g++ python3-dev libc-dev libffi-dev
  236. RUN pip3 install gunicorn
  237. RUN npm install pm2 -g
  238. ENTRYPOINT ["/usr/local/bin/pm2-runtime", "start"]