Skip to content

Commit a9f6073

Browse files
committed
fix: #17
1 parent b252472 commit a9f6073

4 files changed

Lines changed: 40 additions & 34 deletions

File tree

arch.dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
BUILD_DIR \
2121
BUILD_BIN
2222

23-
COPY ./go/ /go
23+
COPY ./build/ /
2424

2525
RUN set -ex; \
2626
cd ${BUILD_DIR}; \
@@ -58,7 +58,8 @@
5858
SOCKET_PROXY_UID=${APP_UID} \
5959
SOCKET_PROXY_GID=${APP_GID} \
6060
SOCKET_PROXY_KEEPALIVE="10s" \
61-
SOCKET_PROXY_TIMEOUT="30s"
61+
SOCKET_PROXY_TIMEOUT="30s" \
62+
SOCKET_PROXY_HTTP_LISTEN_IP="127.0.0.1"
6263

6364
# :: multi-stage
6465
COPY --from=distroless / /
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module github.com/11notes/docker-socket-proxy
22
go 1.25.0
3-
require github.com/11notes/go v1.1.2
3+
require github.com/11notes/go/v2 v2.0.1
Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ import(
1414
"strconv"
1515
"time"
1616

17-
"github.com/11notes/go"
17+
"github.com/11notes/go/v2"
1818
)
1919

2020
var(
21-
Eleven eleven.New = eleven.New{}
2221
proxy *httputil.ReverseProxy
2322
socket net.Listener
2423
wg sync.WaitGroup
@@ -29,49 +28,50 @@ var(
2928
gid string = os.Getenv("SOCKET_PROXY_GID")
3029
volume string = os.Getenv("SOCKET_PROXY_VOLUME")
3130
dockerSocket string = os.Getenv("SOCKET_PROXY_DOCKER_SOCKET")
31+
httpSocket string = os.Getenv("SOCKET_PROXY_HTTP_LISTEN_IP")
3232
)
3333

3434
func prepareFileSystemDropPrivileges(){
3535
// unprivileged user
3636
proxyUID, err := strconv.Atoi(uid)
3737
if err != nil {
38-
Eleven.LogFatal("SOCKET_PROXY_UID must be a number %v", err)
38+
eleven.LogFatal("SOCKET_PROXY_UID must be a number %v", err)
3939
}
4040
proxyGID, err := strconv.Atoi(gid)
4141
if err != nil {
42-
Eleven.LogFatal("SOCKET_PROXY_GID must be a number %v", err)
42+
eleven.LogFatal("SOCKET_PROXY_GID must be a number %v", err)
4343
}
4444
proxyVolume := regexp.MustCompile(`/+$`).ReplaceAllString(volume, "")
4545

4646
// chown file system for unprivileged user
4747
if err := os.Chown(proxyVolume, proxyUID , proxyGID); err != nil {
48-
Eleven.LogFatal("could not chown folder %s", proxyVolume, err)
48+
eleven.LogFatal("could not chown folder %s", proxyVolume, err)
4949
}
5050

5151
// check docker socket permissions
5252
stat, err := os.Stat(dockerSocket)
5353
if err != nil {
54-
Eleven.LogFatal("could not evaluate ownership of docker socket, permission issue %v", err)
54+
eleven.LogFatal("could not evaluate ownership of docker socket, permission issue %v", err)
5555
}
5656
if ownership, ok := stat.Sys().(*syscall.Stat_t); !ok {
57-
Eleven.LogFatal("could not evaluate ownership of docker socket, permission issue %v", err)
57+
eleven.LogFatal("could not evaluate ownership of docker socket, permission issue %v", err)
5858
}else{
5959
if(int(ownership.Uid) != os.Getuid()){
60-
Eleven.LogFatal("can’t access docker socket as UID %d owned by UID %d. Please change the user setting in your compose to the correct UID/GID pair like this >> user: %d:%d", os.Getuid(), ownership.Uid, ownership.Uid, ownership.Gid)
60+
eleven.LogFatal("can’t access docker socket as UID %d owned by UID %d. Please change the user setting in your compose to the correct UID/GID pair like this >> user: %d:%d", os.Getuid(), ownership.Uid, ownership.Uid, ownership.Gid)
6161
}else{
6262
if(int(ownership.Gid) != os.Getgid()){
63-
Eleven.LogFatal("can’t access docker socket as GID %d owned by GID %d. Please change the user setting in your compose to the correct UID/GID pair like this >> user: %d:%d", os.Getgid(), ownership.Gid, os.Getuid(), ownership.Gid)
63+
eleven.LogFatal("can’t access docker socket as GID %d owned by GID %d. Please change the user setting in your compose to the correct UID/GID pair like this >> user: %d:%d", os.Getgid(), ownership.Gid, os.Getuid(), ownership.Gid)
6464
}
6565
}
6666
}
6767

6868
// drop privileges since only the proxy must access the socket as root and nothing else
6969
if err := syscall.Setgid(proxyGID); err != nil {
70-
Eleven.LogFatal("could not set GID to %d %v", proxyGID, err)
70+
eleven.LogFatal("could not set GID to %d %v", proxyGID, err)
7171
}
7272

7373
if err := syscall.Setuid(proxyUID); err != nil {
74-
Eleven.LogFatal("could not set UID to %d %v", proxyUID, err)
74+
eleven.LogFatal("could not set UID to %d %v", proxyUID, err)
7575
}
7676
}
7777

@@ -101,7 +101,7 @@ func httpProxy(w http.ResponseWriter, r *http.Request){
101101
if((method == "GET" || method == "HEAD") && !httpProxyBlockedPaths(url)){
102102
proxy.ServeHTTP(w, r)
103103
}else{
104-
Eleven.Log("INF", "blocked: %s %s", method, url)
104+
eleven.Log("INF", "blocked: %s %s", method, url)
105105
http.Error(w, "", http.StatusForbidden)
106106
}
107107
}
@@ -119,20 +119,20 @@ func healthcheck(exit bool){
119119
if(exit){
120120
os.Exit(0)
121121
}else{
122-
Eleven.Log("DBG", "health check successfully")
122+
eleven.Log("DBG", "health check successfully")
123123
}
124124
}
125125

126126
func main(){
127127
// set socket proxy file path
128128
socketProxy = regexp.MustCompile(`/+$`).ReplaceAllString(volume, "") + "/docker.sock"
129129

130-
if(Eleven.Util.CommandLineArgumentExists("--healthcheck")){
130+
if(eleven.Util.CommandLineArgumentExists("--healthcheck")){
131131
// only run healthcheck
132132
healthcheck(true)
133133
}else{
134134
// start app
135-
Eleven.Log("START", "")
135+
eleven.Log("START", "")
136136

137137
// setup signal handler
138138
signalChannel := make(chan os.Signal, 1)
@@ -145,13 +145,13 @@ func main(){
145145
// setup proxy to docker socket as root
146146
keepAlive, err := time.ParseDuration(keepAlive)
147147
if err != nil {
148-
Eleven.LogFatal("%s not a valid time format: %s", keepAlive, err)
148+
eleven.LogFatal("%s not a valid time format: %s", keepAlive, err)
149149
}
150150
timeout, err := time.ParseDuration(timeout)
151151
if err != nil {
152-
Eleven.LogFatal("%s not a valid time format: %s", timeout, err)
152+
eleven.LogFatal("%s not a valid time format: %s", timeout, err)
153153
}
154-
localhost, _ := url.Parse("http://localhost")
154+
localhost, _ := url.Parse("http://127.0.0.1")
155155
proxy = httputil.NewSingleHostReverseProxy(localhost)
156156
docketSockerDialer := &net.Dialer{KeepAlive: keepAlive, Timeout: timeout}
157157
proxy.Transport = &http.Transport{
@@ -170,14 +170,14 @@ func main(){
170170
os.Remove(socketProxy)
171171
unix, err := net.Listen("unix", socketProxy)
172172
if err != nil {
173-
Eleven.LogFatal("could not start unix socket %v", err)
173+
eleven.LogFatal("could not start unix socket %v", err)
174174
}
175175
wg.Add(1)
176176
go func(){
177177
defer wg.Done()
178-
Eleven.Log("INF", "starting proxy UNIX socket ...")
178+
eleven.Log("INF", "starting proxy UNIX socket on " + socketProxy + " ...")
179179
if err := unixServer.Serve(unix); err != nil {
180-
Eleven.LogFatal("could not start unix socket %v", err)
180+
eleven.LogFatal("could not start unix socket %v", err)
181181
}
182182
}()
183183

@@ -186,32 +186,32 @@ func main(){
186186
Handler: http.HandlerFunc(httpProxy),
187187
}
188188

189-
tcp, err := net.Listen("tcp", "0.0.0.0:2375")
189+
tcp, err := net.Listen("tcp", httpSocket + ":2375")
190190
if err != nil {
191-
Eleven.LogFatal("could not start tcp socket %v", err)
191+
eleven.LogFatal("could not start tcp socket %v", err)
192192
}
193193
wg.Add(1)
194194
go func(){
195195
defer wg.Done()
196-
Eleven.Log("INF", "starting proxy TCP socket ...")
196+
eleven.Log("INF", "starting proxy TCP socket on " + httpSocket + "...")
197197
if err := httpServer.Serve(tcp); err != nil {
198-
Eleven.LogFatal("could not start tcp socket %v", err)
198+
eleven.LogFatal("could not start tcp socket %v", err)
199199
}
200200
}()
201201

202202
// try to access the socket proxy
203203
client := &http.Client{}
204-
req, err := http.NewRequest(http.MethodGet, "http://localhost:2375/version", nil)
204+
req, err := http.NewRequest(http.MethodGet, "http://127.0.0.1:2375/version", nil)
205205
if err != nil {
206-
Eleven.LogFatal("could not create HTTP request %v", err)
206+
eleven.LogFatal("could not create HTTP request %v", err)
207207
}
208208
res, err := client.Do(req)
209209
if err != nil {
210-
Eleven.LogFatal("could not proxy to docker socket %v", err)
210+
eleven.LogFatal("could not proxy to docker socket %v", err)
211211
}
212212
res.Body.Close()
213213
if res.StatusCode != http.StatusOK {
214-
Eleven.LogFatal("could not proxy to docker socket %v", err)
214+
eleven.LogFatal("could not proxy to docker socket %v", err)
215215
}
216216

217217
// set internal socket check

compose.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: "reverse-proxy"
22
services:
33
socket-proxy:
4-
image: "11notes/socket-proxy:2.1.6"
4+
image: "11notes/socket-proxy:2.1.7"
55
read_only: true
66
user: "0:0"
77
environment:
@@ -12,6 +12,8 @@ services:
1212
restart: "always"
1313

1414
traefik:
15+
# for more information about this image checkout:
16+
# https://github.com/11notes/docker-traefik
1517
depends_on:
1618
socket-proxy:
1719
condition: "service_healthy"
@@ -104,7 +106,8 @@ services:
104106
restart: "always"
105107

106108
errors:
107-
# this image can be used to display a simple error message since Traefik can’t serve content
109+
# for more information about this image checkout:
110+
# https://github.com/11notes/docker-postgres
108111
image: "11notes/traefik:errors"
109112
read_only: true
110113
labels:
@@ -118,6 +121,8 @@ services:
118121

119122
# example container
120123
nginx:
124+
# for more information about this image checkout:
125+
# https://github.com/11notes/docker-nginx
121126
image: "11notes/nginx:stable"
122127
read_only: true
123128
labels:

0 commit comments

Comments
 (0)