Skip to content

Commit 76981a5

Browse files
authored
feat: support docker in docker (#760)
1 parent 2097de2 commit 76981a5

File tree

3 files changed

+213
-11
lines changed

3 files changed

+213
-11
lines changed

.devcontainer/devcontainer.json

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{
22
"name": "PDK Image",
33
"image": "public.ecr.aws/p9i6h6j0/aws-pdk:latest",
4+
"overrideCommand": false,
5+
"privileged": true,
6+
"mounts": ["source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"],
47
"customizations": {
58
"vscode": {
69
"extensions": [

docker/Dockerfile

+187-11
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,191 @@
1-
FROM public.ecr.aws/lambda/nodejs:20
1+
FROM public.ecr.aws/amazonlinux/amazonlinux:2023
22

3-
RUN dnf repolist --enabled
4-
RUN dnf install -y automake findutils g++ gcc git gzip make maven python3.11 python3.11-pip tar unzip which wget
5-
RUN git config --global user.email "[email protected]" && git config --global user.name "PDK Build Job"
6-
RUN ln -sf /usr/bin/python3.11 /usr/bin/python
7-
ENV LD_LIBRARY_PATH=""
3+
# Install SSH and other utilities
4+
RUN set -ex \
5+
&& dnf install -y openssh-clients \
6+
&& mkdir ~/.ssh \
7+
&& touch ~/.ssh/known_hosts \
8+
&& ssh-keyscan -t rsa,dsa -H github.com >> ~/.ssh/known_hosts \
9+
&& ssh-keyscan -t rsa,dsa -H bitbucket.org >> ~/.ssh/known_hosts \
10+
&& chmod 600 ~/.ssh/known_hosts \
11+
&& dnf install docker -y \
12+
&& dnf install -y gzip jq openssl openssl-devel tar wget which sudo unzip make gettext gcc curl-devel expat-devel iptables \
13+
&& dnf install -y bzip2-devel libffi-devel ncurses-devel readline-devel sqlite-devel xz-devel zlib-devel libicu
814

9-
# NPM Dependencies
15+
# Install Git
16+
RUN set -ex \
17+
&& GIT_VERSION=2.43.0 \
18+
&& GIT_TAR_FILE=git-$GIT_VERSION.tar.gz \
19+
&& GIT_SRC=https://github.com/git/git/archive/v${GIT_VERSION}.tar.gz \
20+
&& curl -L -o $GIT_TAR_FILE $GIT_SRC \
21+
&& tar zxvf $GIT_TAR_FILE \
22+
&& cd git-$GIT_VERSION \
23+
&& make -j4 prefix=/usr \
24+
&& make install prefix=/usr \
25+
&& cd .. ; rm -rf git-$GIT_VERSION \
26+
&& rm -rf $GIT_TAR_FILE /tmp/*
27+
28+
# Install AWS CLI v2
29+
# https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html
30+
RUN curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o /tmp/awscliv2.zip \
31+
&& unzip -q /tmp/awscliv2.zip -d /opt \
32+
&& /opt/aws/install --update -i /usr/local/aws-cli -b /usr/local/bin \
33+
&& rm /tmp/awscliv2.zip \
34+
&& rm -rf /opt/aws \
35+
&& aws --version
36+
37+
# Install AWS Copilot CLI
38+
# https://aws.github.io/copilot-cli/docs/getting-started/install/
39+
RUN curl -Lo copilot https://github.com/aws/copilot-cli/releases/download/v1.32.1/copilot-linux && chmod +x copilot && sudo mv copilot /usr/local/bin/copilot \
40+
&& dnf install -y dirmngr --allowerasing \
41+
&& gpg --keyserver hkps://keyserver.ubuntu.com --recv BCE9D9A42D51784F \
42+
&& sudo curl -Lo copilot.asc https://github.com/aws/copilot-cli/releases/download/v1.32.1/copilot-linux.asc \
43+
&& gpg --verify copilot.asc /usr/local/bin/copilot \
44+
&& rm -rf copilot.asc
45+
46+
# Install nodejs
47+
ENV NODE_VERSION="v18.19.0"
48+
49+
RUN wget https://nodejs.org/download/release/$NODE_VERSION/node-$NODE_VERSION-linux-x64.tar.gz -O /tmp/nodejs.tar.gz \
50+
&& tar -xvf /tmp/nodejs.tar.gz --directory /usr/local --strip-components 1 \
51+
&& npm config --global set prefix /usr/local/npm \
52+
&& rm -fr /tmp/node*
53+
54+
ENV PATH="/usr/local/npm/bin:$PATH"
55+
56+
# Pre-Build Step - Test Reporting Package
57+
RUN npm install -g @aws/universal-test-runner
58+
59+
# Install Java
60+
ENV JAVA_17_HOME="/usr/lib/jvm/java-17-amazon-corretto.x86_64" \
61+
JDK_17_HOME="/usr/lib/jvm/java-17-amazon-corretto.x86_64" \
62+
JRE_17_HOME="/usr/lib/jvm/java-17-amazon-corretto.x86_64" \
63+
MAVEN_HOME="/opt/maven" \
64+
MAVEN_VERSION=3.9.6 \
65+
INSTALLED_GRADLE_VERSIONS="8.5" \
66+
GRADLE_VERSION=8.5 \
67+
GRADLE_PATH="$SRC_DIR/gradle" \
68+
MAVEN_DOWNLOAD_SHA512="706f01b20dec0305a822ab614d51f32b07ee11d0218175e55450242e49d2156386483b506b3a4e8a03ac8611bae96395fd5eec15f50d3013d5deed6d1ee18224" \
69+
GRADLE_DOWNLOADS_SHA256="c16d517b50dd28b3f5838f0e844b7520b8f1eb610f2f29de7e4e04a1b7c9c79b 8.5"
70+
71+
ARG MAVEN_CONFIG_HOME="/root/.m2"
72+
ENV JAVA_HOME="$JAVA_17_HOME" \
73+
JDK_HOME="$JDK_17_HOME" \
74+
JRE_HOME="$JRE_17_HOME"
75+
76+
# Install Amazon Corretto 17
77+
RUN set -x \
78+
&& yum install -y java-17-amazon-corretto \
79+
&& yum install -y java-17-amazon-corretto-devel \
80+
&& rm $JAVA_HOME/lib/security/cacerts && ln -s /etc/pki/java/cacerts $JAVA_HOME/lib/security/cacerts
81+
82+
# Install Maven
83+
RUN set -ex \
84+
&& mkdir -p $MAVEN_HOME \
85+
&& curl -LSso /var/tmp/apache-maven-$MAVEN_VERSION-bin.tar.gz https://downloads.apache.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz \
86+
&& echo "$MAVEN_DOWNLOAD_SHA512 /var/tmp/apache-maven-$MAVEN_VERSION-bin.tar.gz" | sha512sum -c - \
87+
&& tar xzvf /var/tmp/apache-maven-$MAVEN_VERSION-bin.tar.gz -C $MAVEN_HOME --strip-components=1 \
88+
&& rm /var/tmp/apache-maven-$MAVEN_VERSION-bin.tar.gz \
89+
&& update-alternatives --install /usr/bin/mvn mvn /opt/maven/bin/mvn 10000 \
90+
&& mkdir -p $MAVEN_CONFIG_HOME \
91+
# Install Gradle
92+
&& mkdir -p $GRADLE_PATH \
93+
&& for version in $INSTALLED_GRADLE_VERSIONS; do { \
94+
wget -nv "https://services.gradle.org/distributions/gradle-$version-all.zip" -O "$GRADLE_PATH/gradle-$version-all.zip" \
95+
&& unzip "$GRADLE_PATH/gradle-$version-all.zip" -d /usr/local \
96+
&& echo -e "$GRADLE_DOWNLOADS_SHA256" | grep "$version" | sed "s|$version|$GRADLE_PATH/gradle-$version-all.zip|" | sha256sum -c - \
97+
&& rm "$GRADLE_PATH/gradle-$version-all.zip" \
98+
&& if [ "$version" != "$GRADLE_VERSION" ]; then rm -rf "/usr/local/gradle-$version"; fi; \
99+
}; done \
100+
# Install default GRADLE_VERSION to path
101+
&& ln -s /usr/local/gradle-$GRADLE_VERSION/bin/gradle /usr/bin/gradle \
102+
&& rm -rf $GRADLE_PATH
103+
104+
# Install Python
105+
RUN curl https://pyenv.run | bash
106+
ENV PATH="/root/.pyenv/shims:/root/.pyenv/bin:$PATH"
107+
108+
ENV PYTHON_VERSION="3.11.6"
109+
ENV PYTHON_PIP_VERSION=22.3.1
110+
ENV PYYAML_VERSION=6.0
111+
ENV PYTHON_SETUP_TOOLS_VERSION=67.6.0
112+
113+
RUN sudo ls -alrt /root
114+
RUN cat /root/.pyenv/plugins/python-build/share/python-build/$PYTHON_VERSION
115+
RUN env PYTHON_CONFIGURE_OPTS="--enable-shared --enable-loadable-sqlite-extensions" pyenv install $PYTHON_VERSION && rm -rf /tmp/*
116+
RUN pyenv global $PYTHON_VERSION
117+
RUN set -ex \
118+
&& pip3 install --no-cache-dir --upgrade --force-reinstall "pip==$PYTHON_PIP_VERSION" \
119+
&& pip3 install --no-cache-dir --upgrade "PyYAML==$PYYAML_VERSION" \
120+
&& pip3 install --no-cache-dir --upgrade "setuptools==$PYTHON_SETUP_TOOLS_VERSION" wheel aws-sam-cli boto3 pipenv virtualenv
121+
122+
# Install Dotnet
123+
ENV PATH="/root/.dotnet/:/root/.dotnet/tools/:$PATH"
124+
RUN set -ex \
125+
&& wget -qO /usr/local/bin/dotnet-install.sh https://dot.net/v1/dotnet-install.sh \
126+
&& chmod +x /usr/local/bin/dotnet-install.sh
127+
128+
ENV DOTNET_SDK_VERSION="8.0.100"
129+
ENV DOTNET_ROOT="/root/.dotnet"
130+
131+
# Add .NET Core 6.0 Global Tools install folder to PATH
132+
RUN /usr/local/bin/dotnet-install.sh -v $DOTNET_SDK_VERSION \
133+
&& dotnet --list-sdks \
134+
&& rm -rf /tmp/*
135+
136+
# Install GoLang
137+
RUN git clone https://github.com/syndbg/goenv.git $HOME/.goenv
138+
ENV PATH="/root/.goenv/shims:/root/.goenv/bin:/go/bin:$PATH"
139+
ENV GOENV_DISABLE_GOPATH=1
140+
ENV GOPATH="/go"
141+
ENV GOLANG_VERSION="1.21.5"
142+
143+
RUN goenv install $GOLANG_VERSION && rm -rf /tmp/* && \
144+
goenv global $GOLANG_VERSION && \
145+
go env -w GO111MODULE=auto
146+
147+
RUN go get -u github.com/golang/dep/cmd/dep
148+
149+
# Cleanup
150+
RUN rm -fr /tmp/* /var/tmp/*
151+
152+
# Install Docker
153+
ENV DOCKER_BUCKET="download.docker.com" \
154+
DOCKER_CHANNEL="stable" \
155+
DIND_COMMIT="3b5fac462d21ca164b3778647420016315289034"
156+
157+
ENV DOCKER_SHA256="692ecfc28333485d184f628b74c25b2894cee9495a51a5418ba60ef95bf733ca"
158+
ENV DOCKER_VERSION="24.0.9"
159+
ENV DOCKER_COMPOSE_VERSION="v2.23.3"
160+
161+
VOLUME /var/lib/docker
162+
163+
RUN set -ex \
164+
&& curl -fSL "https://${DOCKER_BUCKET}/linux/static/${DOCKER_CHANNEL}/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
165+
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
166+
&& tar --extract --file docker.tgz --strip-components 1 --directory /usr/local/bin/ \
167+
&& rm docker.tgz \
168+
&& docker -v \
169+
# set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
170+
&& groupadd dockremap \
171+
&& useradd -g dockremap dockremap \
172+
&& echo 'dockremap:165536:65536' >> /etc/subuid \
173+
&& echo 'dockremap:165536:65536' >> /etc/subgid \
174+
&& wget -q "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -O /usr/local/bin/dind \
175+
&& curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose \
176+
&& chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose \
177+
# Ensure docker-compose works
178+
&& docker-compose version
179+
180+
# ===== PDK dependencies =====
181+
182+
# Package managers
10183
RUN npm install -g @aws/pdk aws-cdk bun pnpm projen yarn
11184

12185
# Poetry setup
13186
RUN curl -sSL https://install.python-poetry.org | python
14187
ENV PATH="/root/.local/bin:$PATH"
15188

16-
# JDK
17-
RUN dnf -y install java-17-amazon-corretto-devel
18-
19189
# Graphviz
20190
RUN dnf -y install graphviz
21191

@@ -29,4 +199,10 @@ RUN curl https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6
29199
RUN curl https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.1.0/openapi-generator-cli-7.1.0.jar -o ~/.open-api-generator-cli/7.1.0.jar
30200
RUN curl https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6.6.0/openapi-generator-cli-6.6.0.jar -o ~/.open-api-generator-cli/6.6.0.jar
31201

32-
CMD ["/bin/bash"]
202+
# =====================================
203+
204+
# Entrypoint script
205+
ADD ./dockerd-entrypoint.sh /
206+
207+
ENTRYPOINT ["/dockerd-entrypoint.sh"]
208+
CMD ["sleep", "infinity"]

docker/dockerd-entrypoint.sh

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/bin/sh
2+
set -e
3+
4+
/usr/local/bin/dockerd \
5+
--host=unix:///var/run/docker.sock \
6+
--host=tcp://127.0.0.1:2375 \
7+
--storage-driver=overlay2 &
8+
9+
10+
tries=0
11+
d_timeout=60
12+
until docker info >/dev/null 2>&1
13+
do
14+
if [ "$tries" -gt "$d_timeout" ]; then
15+
cat /var/log/docker.log
16+
echo 'Timed out trying to connect to internal docker host.' >&2
17+
exit 1
18+
fi
19+
tries=$(( $tries + 1 ))
20+
sleep 1
21+
done
22+
23+
eval "$@"

0 commit comments

Comments
 (0)