update
This commit is contained in:
parent
3281207dd0
commit
45b0fbaadc
12 changed files with 217 additions and 168 deletions
7
.codenvy.dockerfile
Normal file
7
.codenvy.dockerfile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
FROM codenvy/ubuntu_jdk8
|
||||||
|
|
||||||
|
# Install Ngrok
|
||||||
|
ADD https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip /ngrok.zip
|
||||||
|
RUN set -x \
|
||||||
|
&& sudo unzip -o /ngrok.zip -d /bin \
|
||||||
|
&& sudo rm -f /ngrok.zip
|
12
.editorconfig
Normal file
12
.editorconfig
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
# top-most EditorConfig file
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.{sh}]
|
||||||
|
indent_size = 4
|
65
Dockerfile
65
Dockerfile
|
@ -1,32 +1,53 @@
|
||||||
FROM alpine as ngrok
|
FROM alpine:3.12
|
||||||
|
|
||||||
RUN apk add --no-cache --virtual .bootstrap-deps ca-certificates && \
|
LABEL org.opencontainers.image.description="Docker-Ngrok" \
|
||||||
wget -O /tmp/ngrok.zip https://git.hhf.technology/hhf/docker-ngrok/src/commit/3a379e0aa43c372c5cbeb3690e110d483ab06a18/ngrok-stable-linux-amd64.zip && \
|
|
||||||
unzip -o /tmp/ngrok.zip -d / && \
|
|
||||||
apk del .bootstrap-deps && \
|
|
||||||
rm -rf /tmp/* && \
|
|
||||||
rm -rf /var/cache/apk/*
|
|
||||||
|
|
||||||
FROM busybox:glibc
|
|
||||||
|
|
||||||
LABEL org.opencontainers.image.description="Ngrok" \
|
|
||||||
org.opencontainers.image.authors="HHF Technology (https://forum.hhf.technology/)" \
|
org.opencontainers.image.authors="HHF Technology (https://forum.hhf.technology/)" \
|
||||||
org.opencontainers.image.url="https://git.hhf.technology/hhf/docker-ngrok" \
|
org.opencontainers.image.url="https://git.hhf.technology/hhf/docker-ngrok" \
|
||||||
org.opencontainers.image.documentation="https://git.hhf.technology/hhf/docker-ngrok" \
|
org.opencontainers.image.documentation="https://git.hhf.technology/hhf/docker-ngrok" \
|
||||||
org.opencontainers.image.source="https://git.hhf.technology/hhf/docker-ngrok"
|
org.opencontainers.image.source="https://git.hhf.technology/hhf/docker-ngrok"
|
||||||
|
|
||||||
COPY --from=ngrok /ngrok /bin/ngrok
|
# https://github.com/sgerrand/alpine-pkg-glibc
|
||||||
COPY start.sh /
|
ARG GLIBC_VERSION=2.31-r0
|
||||||
|
|
||||||
RUN mkdir -p /home/ngrok /home/ngrok/.ngrok2 && \
|
RUN set -x \
|
||||||
printf 'web_addr: 0.0.0.0:4551' > /home/ngrok/.ngrok2/ngrok.yml && \
|
&& apk add --no-cache -t .deps ca-certificates \
|
||||||
addgroup -g 4551 -S ngrok && \
|
# Install glibc on Alpine (required by docker-compose)
|
||||||
adduser -u 4551 -S ngrok -G ngrok -h /home/ngrok -s /bin/ash && \
|
# See also https://github.com/gliderlabs/docker-alpine/issues/11
|
||||||
chown -R ngrok:ngrok /home/ngrok && \
|
&& wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
|
||||||
chmod +x /start.sh
|
&& wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk \
|
||||||
|
&& apk add glibc-${GLIBC_VERSION}.apk \
|
||||||
|
&& rm glibc-${GLIBC_VERSION}.apk \
|
||||||
|
&& apk del --purge .deps
|
||||||
|
|
||||||
USER ngrok:ngrok
|
RUN set -x \
|
||||||
|
# Install ngrok (latest official stable from https://ngrok.com/download).
|
||||||
|
&& apk add --no-cache curl \
|
||||||
|
&& APKARCH="$(apk --print-arch)" \
|
||||||
|
&& case "$APKARCH" in \
|
||||||
|
armhf) NGROKARCH="arm" ;; \
|
||||||
|
armv7) NGROKARCH="arm" ;; \
|
||||||
|
armel) NGROKARCH="arm" ;; \
|
||||||
|
x86) NGROKARCH="386" ;; \
|
||||||
|
x86_64) NGROKARCH="amd64" ;; \
|
||||||
|
esac \
|
||||||
|
&& curl -Lo /ngrok.tgz https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-$NGROKARCH.tgz \
|
||||||
|
&& tar -xzf /ngrok.tgz \
|
||||||
|
&& mv /ngrok /bin \
|
||||||
|
&& chmod 755 /bin/ngrok \
|
||||||
|
&& rm -f /ngrok.tgz \
|
||||||
|
# Create non-root user.
|
||||||
|
&& adduser -h /home/ngrok -D -u 6737 ngrok
|
||||||
|
|
||||||
EXPOSE 4551
|
# Add config script.
|
||||||
|
COPY --chown=ngrok ngrok.yml /home/ngrok/.ngrok2/
|
||||||
|
COPY entrypoint.sh /
|
||||||
|
|
||||||
ENTRYPOINT ["/start.sh"]
|
USER ngrok
|
||||||
|
ENV USER=ngrok
|
||||||
|
|
||||||
|
# Basic sanity check.
|
||||||
|
RUN ngrok --version
|
||||||
|
|
||||||
|
EXPOSE 4040
|
||||||
|
|
||||||
|
CMD ["/entrypoint.sh"]
|
||||||
|
|
35
Dockerfile.armhf
Normal file
35
Dockerfile.armhf
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
FROM resin/raspberrypi3-alpine
|
||||||
|
|
||||||
|
LABEL org.opencontainers.image.description="Docker-Ngrok" \
|
||||||
|
org.opencontainers.image.authors="HHF Technology (https://forum.hhf.technology/)" \
|
||||||
|
org.opencontainers.image.url="https://git.hhf.technology/hhf/docker-ngrok" \
|
||||||
|
org.opencontainers.image.documentation="https://git.hhf.technology/hhf/docker-ngrok" \
|
||||||
|
org.opencontainers.image.source="https://git.hhf.technology/hhf/docker-ngrok"
|
||||||
|
|
||||||
|
|
||||||
|
RUN [ "cross-build-start" ]
|
||||||
|
|
||||||
|
RUN set -x \
|
||||||
|
# Install ngrok (latest official stable from https://ngrok.com/download).
|
||||||
|
&& apk add --no-cache curl \
|
||||||
|
&& curl -Lo /ngrok.zip https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip \
|
||||||
|
&& unzip -o /ngrok.zip -d /bin \
|
||||||
|
&& rm -f /ngrok.zip \
|
||||||
|
# Create non-root user.
|
||||||
|
&& adduser -h /home/ngrok -D -u 6737 ngrok
|
||||||
|
|
||||||
|
# Add config script.
|
||||||
|
COPY --chown=ngrok ngrok.yml /home/ngrok/.ngrok2/
|
||||||
|
COPY entrypoint.sh /
|
||||||
|
|
||||||
|
# Basic sanity check.
|
||||||
|
RUN su ngrok -c 'ngrok --version'
|
||||||
|
|
||||||
|
RUN [ "cross-build-end" ]
|
||||||
|
|
||||||
|
USER ngrok
|
||||||
|
ENV USER=ngrok
|
||||||
|
|
||||||
|
EXPOSE 4040
|
||||||
|
|
||||||
|
CMD ["/entrypoint.sh"]
|
5
LICENSE
5
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2019 Dmitry Shkoliar
|
Copyright (c) 2015 Werner Beroux
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -19,3 +19,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
90
README.md
90
README.md
|
@ -1,90 +0,0 @@
|
||||||
# Docker Ngrok
|
|
||||||
|
|
||||||
A Docker image for [ngrok](https://ngrok.com) service to expose a local docker environment or any other local server to the public internet over secure tunnels. The image is built using official [busybox:glibc](https://hub.docker.com/_/busybox) docker image, so no third party libraries are used, only official busybox and ngrok binary.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Command-line
|
|
||||||
|
|
||||||
**Example**
|
|
||||||
The example below assumes that you have running web server docker container named `dev_web_1` with exposed port `80`.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -it --link dev_web_1 hhftechnologies/ngrok http dev_web_1:80
|
|
||||||
```
|
|
||||||
|
|
||||||
With command line usage, ngrok session is active until it won't be terminated by `Ctrl+C` combination.
|
|
||||||
|
|
||||||
#### Command details
|
|
||||||
|
|
||||||
**Using ngrok parameters**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -it --link <web-container-name> [--net <default-netowrk-name>] hhftechnologies/ngrok <ngrok-parameters> <web-container-name>:<port>
|
|
||||||
```
|
|
||||||
|
|
||||||
For information about ngrok parameters, please refer to [ngrok documentation](https://ngrok.com/docs).
|
|
||||||
|
|
||||||
**Passing parameters to ngrok via env variables**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -it --link <web-container-name> [--net <default-netowrk-name>] --env DOMAIN=<web-container-name> --env PORT=<port> hhftechnologies/ngrok
|
|
||||||
```
|
|
||||||
|
|
||||||
Available env variables can be found below, at [environment variables](#environment-variables) section.
|
|
||||||
|
|
||||||
#### Troubleshooting
|
|
||||||
|
|
||||||
_If you are getting an error like_
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker: Error response from daemon: Cannot link to /dev_web_1, as it does not belong to the default network.
|
|
||||||
```
|
|
||||||
|
|
||||||
_You need to specify default docker network, for example_
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run --rm -it --link dev_web_1 --net dev_default hhftechnologies/ngrok http dev_web_1:80
|
|
||||||
```
|
|
||||||
|
|
||||||
### As part of docker-compose.yml file
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
ngrok:
|
|
||||||
image: hhftechnologies/ngrok:latest
|
|
||||||
ports:
|
|
||||||
- 4551:4551
|
|
||||||
links:
|
|
||||||
- web
|
|
||||||
environment:
|
|
||||||
- DOMAIN=web
|
|
||||||
- PORT=80
|
|
||||||
```
|
|
||||||
|
|
||||||
Where `web` in example above is a web server service name of this docker-compose.yml file.
|
|
||||||
|
|
||||||
If ngrok container is created as part of docker-compose.yml file, ngrok session is active while container is running. To restart or stop session, you will need to restart or stop container respectively.
|
|
||||||
Ngrok web interface available at `http://localhost:4551`.
|
|
||||||
|
|
||||||
## Environment variables
|
|
||||||
|
|
||||||
List of available environment variables to configure ngrok in command line usage or as part of docker-compose.yml file.
|
|
||||||
|
|
||||||
| Name | Values | Default | Information |
|
|
||||||
| :---------- | :------------------------- | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
||||||
| PROTOCOL | http, tls, tcp | http | Ngrok tunneling protocol. |
|
|
||||||
| DOMAIN | \* | localhost | Hostname or docker container, service name which is referred to by ngrok. |
|
|
||||||
| PORT | \* | 80 | Port which is referred to by ngrok. |
|
|
||||||
| REGION | us, eu, ap, au, sa, jp, in | us | Region where the ngrok client will connect to host its tunnels. |
|
|
||||||
| HOST_HEADER | \* | | Optional, rewrite incoming HTTP requests with a modified Host header. e.g. `HOST_HEADER=localdev.test` |
|
|
||||||
| BIND_TLS | true, false | | Optional, forward only HTTP or HTTPS traffic, but not both. By default, when ngrok runs an HTTP tunnel, it opens endpoints for both HTTP and HTTPS traffic. |
|
|
||||||
| SUBDOMAIN | \* | | Optional, specifies the subdomain to use with ngrok, if unspecified ngrok with generate a unique subdomain on each start. |
|
|
||||||
| AUTH_TOKEN | \* | | Optional, token used to authorise your subdomain with ngrok. |
|
|
||||||
| DEBUG | true | | Optional, write logs to stdout. |
|
|
||||||
| PARAMS | \* | | Pass all ngrok parameters by one string. When specified, any other env variables are skipped (Except AUTH_TOKEN).|
|
|
||||||
|
|
||||||
For more information about ngrok parameters, please refer to [ngrok documentation](https://ngrok.com/docs).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](../../blob/master/LICENSE)
|
|
3
docker-compose.test.yml
Normal file
3
docker-compose.test.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
sut:
|
||||||
|
build: .
|
||||||
|
command: sh -c '(ngrok http 8080 &) && sleep 5 && curl --connect-timeout 5 --silent --show-error --fail http://localhost:4040'
|
12
docker-compose.yml
Normal file
12
docker-compose.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
latest:
|
||||||
|
image: hhftechnologies/docker-ngrok:latest
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
# armhf:
|
||||||
|
# image: hhftechnologies/docker-ngrok:armhf
|
||||||
|
# build:
|
||||||
|
# context: .
|
||||||
|
# dockerfile: Dockerfile.armhf
|
98
entrypoint.sh
Normal file
98
entrypoint.sh
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
if [ -n "$@" ]; then
|
||||||
|
exec "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Legacy compatible:
|
||||||
|
if [ -z "$NGROK_PORT" ]; then
|
||||||
|
if [ -n "$HTTPS_PORT" ]; then
|
||||||
|
NGROK_PORT="$HTTPS_PORT"
|
||||||
|
elif [ -n "$HTTPS_PORT" ]; then
|
||||||
|
NGROK_PORT="$HTTP_PORT"
|
||||||
|
elif [ -n "$APP_PORT" ]; then
|
||||||
|
NGROK_PORT="$APP_PORT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
ARGS="ngrok"
|
||||||
|
|
||||||
|
# Set the protocol.
|
||||||
|
if [ "$NGROK_PROTOCOL" = "TCP" ]; then
|
||||||
|
ARGS="$ARGS tcp"
|
||||||
|
elif [ "$NGROK_PROTOCOL" = "TLS" ]; then
|
||||||
|
ARGS="$ARGS tls"
|
||||||
|
NGROK_PORT="${NGROK_PORT:-443}"
|
||||||
|
else
|
||||||
|
ARGS="$ARGS http"
|
||||||
|
NGROK_PORT="${NGROK_PORT:-80}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the TLS binding flag
|
||||||
|
if [ -n "$NGROK_BINDTLS" ]; then
|
||||||
|
ARGS="$ARGS -bind-tls=$NGROK_BINDTLS "
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the authorization token.
|
||||||
|
if [ -n "$NGROK_AUTH" ]; then
|
||||||
|
echo -e "\nauthtoken: $NGROK_AUTH" >> $HOME/.ngrok2/ngrok.yml
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the subdomain or hostname, depending on which is set
|
||||||
|
if [ -n "$NGROK_HOSTNAME" ] && [ -n "$NGROK_AUTH" ]; then
|
||||||
|
ARGS="$ARGS -hostname=$NGROK_HOSTNAME "
|
||||||
|
elif [ -n "$NGROK_SUBDOMAIN" ] && [ -n "$NGROK_AUTH" ]; then
|
||||||
|
ARGS="$ARGS -subdomain=$NGROK_SUBDOMAIN "
|
||||||
|
elif [ -n "$NGROK_HOSTNAME" ] || [ -n "$NGROK_SUBDOMAIN" ]; then
|
||||||
|
if [ -z "$NGROK_AUTH" ]; then
|
||||||
|
echo "You must specify an authentication token after registering at https://ngrok.com to use custom domains."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the remote-addr if specified
|
||||||
|
if [ -n "$NGROK_REMOTE_ADDR" ]; then
|
||||||
|
if [ -z "$NGROK_AUTH" ]; then
|
||||||
|
echo "You must specify an authentication token after registering at https://ngrok.com to use reserved ip addresses."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ARGS="$ARGS -remote-addr=$NGROK_REMOTE_ADDR "
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set a custom region
|
||||||
|
if [ -n "$NGROK_REGION" ]; then
|
||||||
|
ARGS="$ARGS -region=$NGROK_REGION "
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$NGROK_HEADER" ]; then
|
||||||
|
ARGS="$ARGS -host-header=$NGROK_HEADER "
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$NGROK_USERNAME" ] && [ -n "$NGROK_PASSWORD" ] && [ -n "$NGROK_AUTH" ]; then
|
||||||
|
ARGS="$ARGS -auth=$NGROK_USERNAME:$NGROK_PASSWORD "
|
||||||
|
elif [ -n "$NGROK_USERNAME" ] || [ -n "$NGROK_PASSWORD" ]; then
|
||||||
|
if [ -z "$NGROK_AUTH" ]; then
|
||||||
|
echo "You must specify a username, password, and Ngrok authentication token to use the custom HTTP authentication."
|
||||||
|
echo "Sign up for an authentication token at https://ngrok.com"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$NGROK_DEBUG" ]; then
|
||||||
|
ARGS="$ARGS -log stdout"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set the port.
|
||||||
|
if [ -z "$NGROK_PORT" ]; then
|
||||||
|
echo "You must specify a NGROK_PORT to expose."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$NGROK_LOOK_DOMAIN" ]; then
|
||||||
|
ARGS="$ARGS `echo $NGROK_LOOK_DOMAIN:$NGROK_PORT | sed 's|^tcp://||'`"
|
||||||
|
else
|
||||||
|
ARGS="$ARGS `echo $NGROK_PORT | sed 's|^tcp://||'`"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec $ARGS
|
Binary file not shown.
3
ngrok.yml
Normal file
3
ngrok.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
web_addr: 0.0.0.0:4040
|
||||||
|
version: "2"
|
||||||
|
region: us
|
53
start.sh
53
start.sh
|
@ -1,53 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
|
|
||||||
CMD="ngrok"
|
|
||||||
|
|
||||||
$CMD authtoken ${AUTH_TOKEN:-''} > /dev/null
|
|
||||||
|
|
||||||
PARAMS=${PARAMS:-$(echo $@)}
|
|
||||||
|
|
||||||
if [[ -n "$PARAMS" ]]; then
|
|
||||||
if [[ "$PARAMS" == "$CMD "* ]]; then
|
|
||||||
CMD="$PARAMS"
|
|
||||||
else
|
|
||||||
CMD="$CMD $PARAMS"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
PROTOCOL=${PROTOCOL:-http}
|
|
||||||
PORT=${PORT:-80}
|
|
||||||
|
|
||||||
CMD="$CMD $PROTOCOL"
|
|
||||||
|
|
||||||
if [[ -n "$REGION" ]]; then
|
|
||||||
CMD="$CMD -region=$REGION"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$HOST_HEADER" ]]; then
|
|
||||||
CMD="$CMD -host-header=$HOST_HEADER"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$BIND_TLS" ]]; then
|
|
||||||
CMD="$CMD -bind-tls=$BIND_TLS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$SUBDOMAIN" ]]; then
|
|
||||||
CMD="$CMD -subdomain=$SUBDOMAIN"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$BASICAUTH" ]]; then
|
|
||||||
CMD="$CMD --auth=$BASICAUTH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$DEBUG" ]]; then
|
|
||||||
CMD="$CMD -log stdout"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "$DOMAIN" ]]; then
|
|
||||||
CMD="$CMD $DOMAIN:$PORT"
|
|
||||||
else
|
|
||||||
CMD="$CMD $PORT"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -x
|
|
||||||
exec $CMD
|
|
Loading…
Reference in a new issue