Build a k6 binary using Docker
Using the xk6 Docker image can simplify the process of creating a custom k6 binary. It avoids having to setup a local Go environment, and install xk6 manually.
Note
This tutorial is about creating a custom k6 binary (using Docker). If you want to create a Docker image with a custom k6 binary, refer instead to Using modules with Docker.
Building your first extension
For example, to build a custom k6 binary with the latest versions of k6 and the xk6-kafka
and xk6-output-influxdb
extensions, run one of the commands below, depending on your operating system:
docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" grafana/xk6 build \
--with github.com/mostafa/xk6-kafka \
--with github.com/grafana/xk6-output-influxdb
docker run --rm -e GOOS=darwin -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" \
grafana/xk6 build \
--with github.com/mostafa/xk6-kafka \
--with github.com/grafana/xk6-output-influxdb
docker run --rm -e GOOS=windows -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" `
grafana/xk6 build --output k6.exe `
--with github.com/mostafa/xk6-kafka `
--with github.com/grafana/xk6-output-influxdb
docker run --rm -e GOOS=windows -v "%cd%:/xk6" ^
grafana/xk6 build --output k6.exe ^
--with github.com/mostafa/xk6-kafka ^
--with github.com/grafana/xk6-output-influxdb
This creates a k6
(or k6.exe
) binary in the current working directory.
To build the binary with concrete versions, see the example below (k6 v0.45.1
, xk6-kafka v0.19.1
, and xk6-output-influxdb v0.4.1
):
docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" grafana/xk6 build v0.45.1 \
--with github.com/mostafa/xk6-kafka@v0.19.1 \
--with github.com/grafana/xk6-output-influxdb@v0.4.1
docker run --rm -e GOOS=darwin -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" \
grafana/xk6 build v0.45.1 \
--with github.com/mostafa/xk6-kafka@v0.19.1 \
--with github.com/grafana/xk6-output-influxdb@v0.4.1
docker run --rm -e GOOS=windows -u "$(id -u):$(id -g)" -v "${PWD}:/xk6" `
grafana/xk6 build v0.45.1 --output k6.exe `
--with github.com/mostafa/xk6-kafka@v0.19.1 `
--with github.com/grafana/xk6-output-influxdb@v0.4.1
docker run --rm -e GOOS=windows -v "%cd%:/xk6" ^
grafana/xk6 build v0.45.1 --output k6.exe ^
--with github.com/mostafa/xk6-kafka@v0.19.1 ^
--with github.com/grafana/xk6-output-influxdb@v0.4.1
Breaking down the command
The example command line may look a bit intimidating at first, but let’s focus on the first part, which pertains strictly to Docker:
docker run --rm -u "$(id -u):$(id -g)" -v "${PWD}:/xk6"
This tells Docker to run a new container from an image.
--rm
means the container will be destroyed once your build is completed.-u
specifies the user and group IDs of the account on the host machine. This is important for thek6
file to have the same file permissions as the host user.-v
is required to mount the current working directory inside the container, so that thek6
binary can be written to it.
For Windows and Mac, we additionally include the target system as an environment variable:
-e GOOS=<target os>
The remainder is straight from the xk6 documentation, with the exception that we use the grafana/xk6
image rather than a local installation of xk6
:
grafana/xk6 build [<k6_version>]
[--output <file>]
[--with <module[@version][=replacement]>...]
[--replace <module=replacement>...]
Flags:
--output specifies the new binary name [default: 'k6']
--replace enables override of dependencies for k6 and extensions [default: none]
--with the extension module to be included in the binary [default: none]
Caution
The use of--replace
should be considered an advanced feature to be avoided unless required.
Referring back to our executed command, note that:
- We specify the version as
v0.43.1
. When you omit the version or specifylatest
, you build using the latest source code for k6. Consider using a stable release version as a best practice unless you genuinely want the bleeding edge. - We specify a full GitHub URI for the extension repository with each
--with
. If a version is not specified, the default is again thelatest
. Check your extension repository for stable release versions, if available, to lock in your version as we’ve done withxk6-kafka@v0.17.0
andxk6-output-influxdb@v0.3.0
. - For Windows, we used the
--output
option to name our result ask6.exe
; if not specified, our new binary isk6
within the current directory. If you specify a directory, the new binary will bek6
within that directory. If you specify a path to a non-existent file, e.g./tmp/k6-extended
, this will be the path and filename for the binary.
Run ./k6 version
(or k6.exe version
) to check that your build is based on the appropriate k6
version and contains the desired extensions. For example:
$ ./k6 version
k6 v0.43.1 ((devel), go1.20.1, darwin/amd64)
Extensions:
github.com/grafana/xk6-output-influxdb v0.3.0, xk6-influxdb [output]
github.com/mostafa/xk6-kafka v0.17.0, k6/x/kafka [js]
Running your extended binary
Now that we have our newly built k6 binary, we can run scripts using the functionalities of the bundled extensions.
./k6 run my-script.js
k6.exe run my-script.js
Be sure to specify the binary just built in the current directory as
./k6
, or else Linux/Mac could execute another k6 binary on your system path. Windows shells will first search for the binary in the current directory by default.
Encountering issues?
If you’re having issues, search the k6 Community Forum. Someone may have had the same issue in the past.