Skip to content

Commit 24a60ce

Browse files
authored
feat(memcached): add memcached module (#3132)
* feat(memcached): add memcached module * docs: add release marker * docs: fix markers * docs: fix markers
1 parent 60c7eac commit 24a60ce

File tree

10 files changed

+491
-0
lines changed

10 files changed

+491
-0
lines changed

.github/dependabot.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ updates:
4444
- /modules/localstack
4545
- /modules/mariadb
4646
- /modules/meilisearch
47+
- /modules/memcached
4748
- /modules/milvus
4849
- /modules/minio
4950
- /modules/mockserver

.vscode/.testcontainers-go.code-workspace

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@
125125
"name": "module / meilisearch",
126126
"path": "../modules/meilisearch"
127127
},
128+
{
129+
"name": "module / memcached",
130+
"path": "../modules/memcached"
131+
},
128132
{
129133
"name": "module / milvus",
130134
"path": "../modules/milvus"

docs/modules/memcached.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Memcached
2+
3+
Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
4+
5+
## Introduction
6+
7+
The Testcontainers module for Memcached.
8+
9+
## Adding this module to your project dependencies
10+
11+
Please run the following command to add the Memcached module to your Go dependencies:
12+
13+
```
14+
go get github.com/testcontainers/testcontainers-go/modules/memcached
15+
```
16+
17+
## Usage example
18+
19+
<!--codeinclude-->
20+
[Creating a Memcached container](../../modules/memcached/examples_test.go) inside_block:runMemcachedContainer
21+
<!--/codeinclude-->
22+
23+
## Module Reference
24+
25+
### Run function
26+
27+
- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
28+
29+
The Memcached module exposes one entrypoint function to create the Memcached container, and this function receives three parameters:
30+
31+
```golang
32+
func Run(ctx context.Context, img string, opts ...testcontainers.ContainerCustomizer) (*Container, error)
33+
```
34+
35+
- `context.Context`, the Go context.
36+
- `string`, the Docker image to use.
37+
- `testcontainers.ContainerCustomizer`, a variadic argument for passing options.
38+
39+
### Container Options
40+
41+
When starting the Memcached container, you can pass options in a variadic way to configure it.
42+
43+
#### Image
44+
45+
Use the second argument in the `Run` function to set a valid Docker image.
46+
In example: `Run(context.Background(), "memcached:1.6-alpine")`.
47+
48+
{% include "../features/common_functional_options.md" %}
49+
50+
### Container Methods
51+
52+
The Memcached container exposes the following methods:
53+
54+
#### HostPort
55+
56+
- Not available until the next release of testcontainers-go <a href="https://github.com/testcontainers/testcontainers-go"><span class="tc-version">:material-tag: main</span></a>
57+
58+
The `HostPort` method returns the host and port of the Memcached container, in the format `host:port`. Use this method to connect to the Memcached container from your application.
59+
60+
<!--codeinclude-->
61+
[Get host:port](../../modules/memcached/examples_test.go) inside_block:hostPort
62+
<!--/codeinclude-->

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ nav:
9797
- modules/localstack.md
9898
- modules/mariadb.md
9999
- modules/meilisearch.md
100+
- modules/memcached.md
100101
- modules/milvus.md
101102
- modules/minio.md
102103
- modules/mockserver.md

modules/memcached/Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
include ../../commons-test.mk
2+
3+
.PHONY: test
4+
test:
5+
$(MAKE) test-memcached

modules/memcached/examples_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package memcached_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/bradfitz/gomemcache/memcache"
9+
10+
"github.com/testcontainers/testcontainers-go"
11+
"github.com/testcontainers/testcontainers-go/modules/memcached"
12+
)
13+
14+
func ExampleRun() {
15+
// runMemcachedContainer {
16+
ctx := context.Background()
17+
18+
memcachedContainer, err := memcached.Run(ctx, "memcached:1.6-alpine")
19+
defer func() {
20+
if err := testcontainers.TerminateContainer(memcachedContainer); err != nil {
21+
log.Printf("failed to terminate container: %s", err)
22+
}
23+
}()
24+
if err != nil {
25+
log.Printf("failed to start container: %s", err)
26+
return
27+
}
28+
// }
29+
30+
state, err := memcachedContainer.State(ctx)
31+
if err != nil {
32+
log.Printf("failed to get container state: %s", err)
33+
return
34+
}
35+
36+
fmt.Println(state.Running)
37+
38+
// Output:
39+
// true
40+
}
41+
42+
func ExampleRun_connect() {
43+
ctx := context.Background()
44+
45+
memcachedContainer, err := memcached.Run(ctx, "memcached:1.6-alpine")
46+
defer func() {
47+
if err := testcontainers.TerminateContainer(memcachedContainer); err != nil {
48+
log.Printf("failed to terminate container: %s", err)
49+
}
50+
}()
51+
if err != nil {
52+
log.Printf("failed to start container: %s", err)
53+
return
54+
}
55+
56+
// hostPort {
57+
hostPort, err := memcachedContainer.HostPort(ctx)
58+
if err != nil {
59+
log.Printf("failed to get host and port: %s", err)
60+
return
61+
}
62+
// }
63+
64+
mc := memcache.New(hostPort)
65+
66+
err = mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})
67+
if err != nil {
68+
log.Printf("failed to set item: %s", err)
69+
return
70+
}
71+
72+
it, err := mc.Get("foo")
73+
if err != nil {
74+
log.Printf("failed to get item: %s", err)
75+
return
76+
}
77+
78+
fmt.Println(string(it.Value))
79+
80+
// Output:
81+
// my value
82+
}

modules/memcached/go.mod

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
module github.com/testcontainers/testcontainers-go/modules/memcached
2+
3+
go 1.23.0
4+
5+
require (
6+
github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf
7+
github.com/stretchr/testify v1.10.0
8+
github.com/testcontainers/testcontainers-go v0.37.0
9+
)
10+
11+
require (
12+
dario.cat/mergo v1.0.1 // indirect
13+
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
14+
github.com/Microsoft/go-winio v0.6.2 // indirect
15+
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
16+
github.com/containerd/log v0.1.0 // indirect
17+
github.com/containerd/platforms v0.2.1 // indirect
18+
github.com/cpuguy83/dockercfg v0.3.2 // indirect
19+
github.com/davecgh/go-spew v1.1.1 // indirect
20+
github.com/distribution/reference v0.6.0 // indirect
21+
github.com/docker/docker v28.0.1+incompatible // indirect
22+
github.com/docker/go-connections v0.5.0 // indirect
23+
github.com/docker/go-units v0.5.0 // indirect
24+
github.com/ebitengine/purego v0.8.2 // indirect
25+
github.com/felixge/httpsnoop v1.0.4 // indirect
26+
github.com/go-logr/logr v1.4.2 // indirect
27+
github.com/go-logr/stdr v1.2.2 // indirect
28+
github.com/go-ole/go-ole v1.2.6 // indirect
29+
github.com/gogo/protobuf v1.3.2 // indirect
30+
github.com/google/uuid v1.6.0 // indirect
31+
github.com/klauspost/compress v1.17.4 // indirect
32+
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
33+
github.com/magiconair/properties v1.8.10 // indirect
34+
github.com/moby/docker-image-spec v1.3.1 // indirect
35+
github.com/moby/patternmatcher v0.6.0 // indirect
36+
github.com/moby/sys/sequential v0.5.0 // indirect
37+
github.com/moby/sys/user v0.1.0 // indirect
38+
github.com/moby/sys/userns v0.1.0 // indirect
39+
github.com/moby/term v0.5.0 // indirect
40+
github.com/morikuni/aec v1.0.0 // indirect
41+
github.com/opencontainers/go-digest v1.0.0 // indirect
42+
github.com/opencontainers/image-spec v1.1.1 // indirect
43+
github.com/pkg/errors v0.9.1 // indirect
44+
github.com/pmezard/go-difflib v1.0.0 // indirect
45+
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
46+
github.com/shirou/gopsutil/v4 v4.25.1 // indirect
47+
github.com/sirupsen/logrus v1.9.3 // indirect
48+
github.com/tklauser/go-sysconf v0.3.12 // indirect
49+
github.com/tklauser/numcpus v0.6.1 // indirect
50+
github.com/yusufpapurcu/wmi v1.2.4 // indirect
51+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
52+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
53+
go.opentelemetry.io/otel v1.35.0 // indirect
54+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect
55+
go.opentelemetry.io/otel/metric v1.35.0 // indirect
56+
go.opentelemetry.io/otel/sdk v1.35.0 // indirect
57+
go.opentelemetry.io/otel/trace v1.35.0 // indirect
58+
go.opentelemetry.io/proto/otlp v1.6.0 // indirect
59+
golang.org/x/crypto v0.37.0 // indirect
60+
golang.org/x/sys v0.32.0 // indirect
61+
google.golang.org/protobuf v1.36.6 // indirect
62+
gopkg.in/yaml.v3 v3.0.1 // indirect
63+
)
64+
65+
replace github.com/testcontainers/testcontainers-go => ../..

0 commit comments

Comments
 (0)