-
Notifications
You must be signed in to change notification settings - Fork 0
/
Dockerfile
166 lines (150 loc) · 7.05 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
FROM php:7.1-cli-alpine3.4
LABEL maintainer="ihipop <ihipop#gmail.com>"
LABEL description="PHP + NODEJS in Alpine"
#Inspire by https://github.com/mhart/alpine-node
#YOU can use `--build-arg IN_CHINA=true` in command line to overwride this VAR
ARG IN_CHINA="false"
ARG HTTP_PROXY=""
ARG HTTPS_PROXY=""
ARG DEL_PKGS=""
#Always install these package and preserve
ARG INSTALL_PKGS=""
ARG STATIC_BUILD="false"
ARG ALPINE_GLIBC_PACKAGE_VERSION="2.26-r0"
# ---------------------------------------------------------------------------------------
ARG NODEJS_VERSION=v8.9.4
ARG NPM_VERSION=5
ARG YARN_VERSION=latest
# ENV NODEJS_VERSION=v4.8.7 NPM_VERSION=2
# ENV NODEJS_VERSION=v6.12.3 NPM_VERSION=3
# ENV NODEJS_VERSION=v8.9.4 NPM_VERSION=5 YARN_VERSION=latest
ENV NODEJS_VERSION=${NODEJS_VERSION} NPM_VERSION=${NPM_VERSION} YARN_VERSION=${YARN_VERSION}
# Useless if docker image is builded
ARG DEL_PKGS_INTERNAL="python gnupg binutils-gold linux-headers ${DEL_PKGS} "
# Usefull when dynamic build
ARG INSTALL_PKGS_DYNAMIC=" \
# advcomp (libstdc++.so, libgcc_s.so)
libstdc++ \
# jpegoptim (libjpeg.so)
libjpeg-turbo-dev \
# pngquant
libpng-dev \
# mozjpeg
pkgconfig autoconf automake libtool nasm \
# advancecomp
zlib-dev \
# make
make gcc g++ \
"
RUN [ "$IN_CHINA" == "true" ] && echo 'http://mirrors.ustc.edu.cn/alpine/v3.4/main/' >/etc/apk/repositories \
&& echo 'http://mirrors.ustc.edu.cn/alpine/v3.4/community/' >>/etc/apk/repositories || true
RUN apk add --no-cache \
unzip git curl ${INSTALL_PKGS}
# For Build NPMs Family
ARG CONFIG_FLAGS=""
ARG RM_DIRS=""
RUN if [ "$STATIC_BUILD" == "true" ]; then \
CONFIG_FLAGS="--fully-static --without-npm ${CONFIG_FLAGS}" ;\
fi && \
if [ "$CONFIG_FLAGS" ] && [ -z ${CONFIG_FLAGS##*fully-static*} ];then \
# if ARG CONFIG_FLAGS has "--fully-static"
echo "-------------Running Static Build-------------" && \
STATIC_BUILD="true" && \
RM_DIRS="${RM_DIRS} /usr/include" && \
DEL_PKGS_INTERNAL="${INSTALL_PKGS_DYNAMIC} ${DEL_PKGS_INTERNAL}" ; \
else \
echo "-------------Running Dynamic Build-------------" && \
STATIC_BUILD="" ; \
fi && \
INSTALL_PKGS_INTERNAL="${INSTALL_PKGS_DYNAMIC} ${DEL_PKGS_INTERNAL}" && \
#echo $INSTALL_PKGS_INTERNAL && \
# echo $DEL_PKGS_INTERNAL && \
# exit 1 ;\
apk add --no-cache ${INSTALL_PKGS_INTERNAL} && \
for server in pgp.mit.edu keyserver.pgp.com ha.pool.sks-keyservers.net; do \
gpg --keyserver $server --recv-keys \
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
FD3A5288F042B6850C66B31F09FE44734EB7990E \
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
B9AE9905FFD7803F25714661B63B535A4C206CA9 \
56730D5401028683275BD23C23EFEFE93C4CFFFE \
77984A986EBC2AA786BC0F66B01FBB92821C587A && break; \
done && \
curl -sfSLO https://nodejs.org/dist/${NODEJS_VERSION}/node-${NODEJS_VERSION}.tar.xz && \
curl -sfSL https://nodejs.org/dist/${NODEJS_VERSION}/SHASUMS256.txt.asc | gpg --batch --decrypt | \
grep " node-${NODEJS_VERSION}.tar.xz\$" | sha256sum -c | grep ': OK$' && \
tar -xf node-${NODEJS_VERSION}.tar.xz && \
cd node-${NODEJS_VERSION} && \
./configure --prefix=/usr ${CONFIG_FLAGS} && \
CPU_NUMBER=$(getconf _NPROCESSORS_ONLN) && \
if [ $CPU_NUMBER -gt 1 ];then \
CPU_NUMBER=$((${CPU_NUMBER}-1)); \
fi && \
make -j${CPU_NUMBER} && \
make install && \
cd / && \
# if have npm and is not static build
if [ -z ${CONFIG_FLAGS##*fully-static*} ] && [ `which npm` ]; then \
if [ -n "$NPM_VERSION" ]; then \
if [ "$IN_CHINA" == "true" ]; then \
npm config set registry https://registry.npm.taobao.org; \
fi; \
npm install -g npm@${NPM_VERSION}; \
npm install -g cnpm; \
fi; \
find /usr/lib/node_modules/npm -name test -o -name .bin -type d | xargs rm -rf && \
if [ -n "$YARN_VERSION" ]; then \
for server in pgp.mit.edu keyserver.pgp.com ha.pool.sks-keyservers.net; do \
gpg --keyserver $server --recv-keys \
6A010C5166006599AA17F08146C2130DFD2497F5 && break; \
done && \
curl -sfSL -O https://yarnpkg.com/${YARN_VERSION}.tar.gz -O https://yarnpkg.com/${YARN_VERSION}.tar.gz.asc && \
gpg --batch --verify ${YARN_VERSION}.tar.gz.asc ${YARN_VERSION}.tar.gz && \
mkdir /usr/local/share/yarn && \
tar -xf ${YARN_VERSION}.tar.gz -C /usr/local/share/yarn --strip 1 && \
ln -s /usr/local/share/yarn/bin/yarn /usr/local/bin/ && \
ln -s /usr/local/share/yarn/bin/yarnpkg /usr/local/bin/ && \
rm ${YARN_VERSION}.tar.gz*; \
fi ; \
fi && \
apk del ${DEL_PKGS_INTERNAL} && \
rm -rf ${RM_DIRS} /node-${NODEJS_VERSION}* /usr/share/man /tmp/* /var/cache/apk/* \
/root/.npm /root/.node-gyp /root/.gnupg /usr/lib/node_modules/npm/man \
/usr/lib/node_modules/npm/doc /usr/lib/node_modules/npm/html /usr/lib/node_modules/npm/scripts
# Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.
ENV LANG=en_US.UTF-8
# ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8
RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \
# ALPINE_GLIBC_PACKAGE_VERSION="2.26-r0" && \
ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
apk add --no-cache --virtual=.build-dependencies curl ca-certificates && \
curl -L \
"https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub" \
-o "/etc/apk/keys/sgerrand.rsa.pub" && \
curl -L "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" -o "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" && \
curl -L "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" -o "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" && \
curl -L "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" -o "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
apk add --no-cache \
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
\
rm "/etc/apk/keys/sgerrand.rsa.pub" && \
/usr/glibc-compat/bin/localedef -vvv --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \
echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \
\
apk del glibc-i18n && \
\
rm -f "/root/.wget-hsts" && \
apk del .build-dependencies && \
rm \
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
VOLUME ["/project", "/ssh", "/tmp"]
WORKDIR /project