Add --add-host for docker build
| ... | ... |
@@ -53,6 +53,7 @@ func newImageBuildOptions(ctx context.Context, r *http.Request) (*types.ImageBui |
| 53 | 53 |
options.CgroupParent = r.FormValue("cgroupparent")
|
| 54 | 54 |
options.NetworkMode = r.FormValue("networkmode")
|
| 55 | 55 |
options.Tags = r.Form["t"] |
| 56 |
+ options.ExtraHosts = r.Form["extrahosts"] |
|
| 56 | 57 |
options.SecurityOpt = r.Form["securityopt"] |
| 57 | 58 |
options.Squash = httputils.BoolValue(r, "squash") |
| 58 | 59 |
|
| ... | ... |
@@ -4417,6 +4417,10 @@ paths: |
| 4417 | 4417 |
in: "query" |
| 4418 | 4418 |
description: "A name and optional tag to apply to the image in the `name:tag` format. If you omit the tag the default `latest` value is assumed. You can provide several `t` parameters." |
| 4419 | 4419 |
type: "string" |
| 4420 |
+ - name: "extrahosts" |
|
| 4421 |
+ in: "query" |
|
| 4422 |
+ description: "Extra hosts to add to /etc/hosts" |
|
| 4423 |
+ type: "string" |
|
| 4420 | 4424 |
- name: "remote" |
| 4421 | 4425 |
in: "query" |
| 4422 | 4426 |
description: "A Git repository URI or HTTP/HTTPS context URI. If the URI points to a single text file, the file’s contents are placed into a file called `Dockerfile` and the image is built from that file. If the URI points to a tarball, the file is downloaded by the daemon and the contents therein used as the context for the build. If the URI points to a tarball and the `dockerfile` parameter is also specified, there must be a file with the corresponding path inside the tarball." |
| ... | ... |
@@ -176,6 +176,7 @@ type ImageBuildOptions struct {
|
| 176 | 176 |
// specified here do not need to have a valid parent chain to match cache. |
| 177 | 177 |
CacheFrom []string |
| 178 | 178 |
SecurityOpt []string |
| 179 |
+ ExtraHosts []string // List of extra hosts |
|
| 179 | 180 |
} |
| 180 | 181 |
|
| 181 | 182 |
// ImageBuildResponse holds information |
| ... | ... |
@@ -498,7 +498,8 @@ func (b *Builder) create() (string, error) {
|
| 498 | 498 |
Resources: resources, |
| 499 | 499 |
NetworkMode: container.NetworkMode(b.options.NetworkMode), |
| 500 | 500 |
// Set a log config to override any default value set on the daemon |
| 501 |
- LogConfig: defaultLogConfig, |
|
| 501 |
+ LogConfig: defaultLogConfig, |
|
| 502 |
+ ExtraHosts: b.options.ExtraHosts, |
|
| 502 | 503 |
} |
| 503 | 504 |
|
| 504 | 505 |
config := *b.runConfig |
| ... | ... |
@@ -38,6 +38,7 @@ type buildOptions struct {
|
| 38 | 38 |
tags opts.ListOpts |
| 39 | 39 |
labels opts.ListOpts |
| 40 | 40 |
buildArgs opts.ListOpts |
| 41 |
+ extraHosts opts.ListOpts |
|
| 41 | 42 |
ulimits *opts.UlimitOpt |
| 42 | 43 |
memory string |
| 43 | 44 |
memorySwap string |
| ... | ... |
@@ -65,10 +66,11 @@ type buildOptions struct {
|
| 65 | 65 |
func NewBuildCommand(dockerCli *command.DockerCli) *cobra.Command {
|
| 66 | 66 |
ulimits := make(map[string]*units.Ulimit) |
| 67 | 67 |
options := buildOptions{
|
| 68 |
- tags: opts.NewListOpts(validateTag), |
|
| 69 |
- buildArgs: opts.NewListOpts(opts.ValidateEnv), |
|
| 70 |
- ulimits: opts.NewUlimitOpt(&ulimits), |
|
| 71 |
- labels: opts.NewListOpts(opts.ValidateEnv), |
|
| 68 |
+ tags: opts.NewListOpts(validateTag), |
|
| 69 |
+ buildArgs: opts.NewListOpts(opts.ValidateEnv), |
|
| 70 |
+ ulimits: opts.NewUlimitOpt(&ulimits), |
|
| 71 |
+ labels: opts.NewListOpts(opts.ValidateEnv), |
|
| 72 |
+ extraHosts: opts.NewListOpts(opts.ValidateExtraHost), |
|
| 72 | 73 |
} |
| 73 | 74 |
|
| 74 | 75 |
cmd := &cobra.Command{
|
| ... | ... |
@@ -108,6 +110,7 @@ func NewBuildCommand(dockerCli *command.DockerCli) *cobra.Command {
|
| 108 | 108 |
flags.StringSliceVar(&options.securityOpt, "security-opt", []string{}, "Security options")
|
| 109 | 109 |
flags.StringVar(&options.networkMode, "network", "default", "Set the networking mode for the RUN instructions during build") |
| 110 | 110 |
flags.SetAnnotation("network", "version", []string{"1.25"})
|
| 111 |
+ flags.Var(&options.extraHosts, "add-host", "Add a custom host-to-IP mapping (host:ip)") |
|
| 111 | 112 |
|
| 112 | 113 |
command.AddTrustVerificationFlags(flags) |
| 113 | 114 |
|
| ... | ... |
@@ -301,6 +304,7 @@ func runBuild(dockerCli *command.DockerCli, options buildOptions) error {
|
| 301 | 301 |
SecurityOpt: options.securityOpt, |
| 302 | 302 |
NetworkMode: options.networkMode, |
| 303 | 303 |
Squash: options.squash, |
| 304 |
+ ExtraHosts: options.extraHosts.GetAll(), |
|
| 304 | 305 |
} |
| 305 | 306 |
|
| 306 | 307 |
response, err := dockerCli.Client().ImageBuild(ctx, body, buildOptions) |
| ... | ... |
@@ -48,6 +48,7 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur |
| 48 | 48 |
query := url.Values{
|
| 49 | 49 |
"t": options.Tags, |
| 50 | 50 |
"securityopt": options.SecurityOpt, |
| 51 |
+ "extrahosts": options.ExtraHosts, |
|
| 51 | 52 |
} |
| 52 | 53 |
if options.SuppressOutput {
|
| 53 | 54 |
query.Set("q", "1")
|
| ... | ... |
@@ -21,6 +21,7 @@ keywords: "API, Docker, rcli, REST, documentation" |
| 21 | 21 |
* `GET /networks` is optimised only to return list of all networks and network specific information. List of all containers attached to a specific network is removed from this API and is only available using the network specific `GET /networks/{network-id}.
|
| 22 | 22 |
* `GET /containers/json` now supports `publish` and `expose` filters to filter containers that expose or publish certain ports. |
| 23 | 23 |
* `POST /services/create` and `POST /services/(id or name)/update` now accept the `ReadOnly` parameter, which mounts the container's root filesystem as read only. |
| 24 |
+* `POST /build` now accepts `extrahosts` parameter to specify a host to ip mapping to use during the build. |
|
| 24 | 25 |
|
| 25 | 26 |
## v1.26 API changes |
| 26 | 27 |
|
| ... | ... |
@@ -21,6 +21,7 @@ Usage: docker build [OPTIONS] PATH | URL | - |
| 21 | 21 |
Build an image from a Dockerfile |
| 22 | 22 |
|
| 23 | 23 |
Options: |
| 24 |
+ --add-host value Add a custom host-to-IP mapping (host:ip) (default []) |
|
| 24 | 25 |
--build-arg value Set build-time variables (default []) |
| 25 | 26 |
--cache-from value Images to consider as cache sources (default []) |
| 26 | 27 |
--cgroup-parent string Optional parent cgroup for the container |
| ... | ... |
@@ -435,6 +436,13 @@ Linux namespaces. On Microsoft Windows, you can specify these values: |
| 435 | 435 |
|
| 436 | 436 |
Specifying the `--isolation` flag without a value is the same as setting `--isolation="default"`. |
| 437 | 437 |
|
| 438 |
+### Add entries to container hosts file (--add-host) |
|
| 439 |
+ |
|
| 440 |
+You can add other hosts into a container's `/etc/hosts` file by using one or |
|
| 441 |
+more `--add-host` flags. This example adds a static address for a host named |
|
| 442 |
+`docker`: |
|
| 443 |
+ |
|
| 444 |
+ $ docker build --add-host=docker:10.180.0.1 . |
|
| 438 | 445 |
|
| 439 | 446 |
### Squash an image's layers (--squash) **Experimental Only** |
| 440 | 447 |
|
| ... | ... |
@@ -451,3 +459,4 @@ space. |
| 451 | 451 |
**Note**: using this option you may see significantly more space used due to |
| 452 | 452 |
storing two copies of the image, one for the build cache with all the cache |
| 453 | 453 |
layers in tact, and one for the squashed version. |
| 454 |
+ |
| ... | ... |
@@ -5567,6 +5567,49 @@ func (s *DockerSuite) TestBuildNetContainer(c *check.C) {
|
| 5567 | 5567 |
c.Assert(strings.TrimSpace(host), check.Equals, "foobar") |
| 5568 | 5568 |
} |
| 5569 | 5569 |
|
| 5570 |
+func (s *DockerSuite) TestBuildWithExtraHost(c *check.C) {
|
|
| 5571 |
+ testRequires(c, DaemonIsLinux) |
|
| 5572 |
+ |
|
| 5573 |
+ name := "testbuildwithextrahost" |
|
| 5574 |
+ buildImageSuccessfully(c, name, |
|
| 5575 |
+ withBuildFlags( |
|
| 5576 |
+ "--add-host", "foo:127.0.0.1", |
|
| 5577 |
+ "--add-host", "bar:127.0.0.1", |
|
| 5578 |
+ ), |
|
| 5579 |
+ withDockerfile(` |
|
| 5580 |
+ FROM busybox |
|
| 5581 |
+ RUN ping -c 1 foo |
|
| 5582 |
+ RUN ping -c 1 bar |
|
| 5583 |
+ `)) |
|
| 5584 |
+} |
|
| 5585 |
+ |
|
| 5586 |
+func (s *DockerSuite) TestBuildWithExtraHostInvalidFormat(c *check.C) {
|
|
| 5587 |
+ testRequires(c, DaemonIsLinux) |
|
| 5588 |
+ dockerfile := ` |
|
| 5589 |
+ FROM busybox |
|
| 5590 |
+ RUN ping -c 1 foo` |
|
| 5591 |
+ |
|
| 5592 |
+ testCases := []struct {
|
|
| 5593 |
+ testName string |
|
| 5594 |
+ dockerfile string |
|
| 5595 |
+ buildFlag string |
|
| 5596 |
+ }{
|
|
| 5597 |
+ {"extra_host_missing_ip", dockerfile, "--add-host=foo"},
|
|
| 5598 |
+ {"extra_host_missing_ip_with_delimeter", dockerfile, "--add-host=foo:"},
|
|
| 5599 |
+ {"extra_host_missing_hostname", dockerfile, "--add-host=:127.0.0.1"},
|
|
| 5600 |
+ {"extra_host_invalid_ipv4", dockerfile, "--add-host=foo:101.10.2"},
|
|
| 5601 |
+ {"extra_host_invalid_ipv6", dockerfile, "--add-host=foo:2001::1::3F"},
|
|
| 5602 |
+ } |
|
| 5603 |
+ |
|
| 5604 |
+ for _, tc := range testCases {
|
|
| 5605 |
+ result := buildImage(tc.testName, withBuildFlags(tc.buildFlag), withDockerfile(tc.dockerfile)) |
|
| 5606 |
+ result.Assert(c, icmd.Expected{
|
|
| 5607 |
+ ExitCode: 125, |
|
| 5608 |
+ }) |
|
| 5609 |
+ } |
|
| 5610 |
+ |
|
| 5611 |
+} |
|
| 5612 |
+ |
|
| 5570 | 5613 |
func (s *DockerSuite) TestBuildSquashParent(c *check.C) {
|
| 5571 | 5614 |
testRequires(c, ExperimentalDaemon) |
| 5572 | 5615 |
dockerFile := ` |
| ... | ... |
@@ -6,6 +6,7 @@ docker-build - Build an image from a Dockerfile |
| 6 | 6 |
|
| 7 | 7 |
# SYNOPSIS |
| 8 | 8 |
**docker build** |
| 9 |
+[**--add-host**[=*[]*]] |
|
| 9 | 10 |
[**--build-arg**[=*[]*]] |
| 10 | 11 |
[**--cpu-shares**[=*0*]] |
| 11 | 12 |
[**--cgroup-parent**[=*CGROUP-PARENT*]] |
| ... | ... |
@@ -74,6 +75,12 @@ set as the **URL**, the repository is cloned locally and then sent as the contex |
| 74 | 74 |
storing two copies of the image, one for the build cache with all the cache |
| 75 | 75 |
layers in tact, and one for the squashed version. |
| 76 | 76 |
|
| 77 |
+**--add-host**=[] |
|
| 78 |
+ Add a custom host-to-IP mapping (host:ip) |
|
| 79 |
+ |
|
| 80 |
+ Add a line to /etc/hosts. The format is hostname:ip. The **--add-host** |
|
| 81 |
+option can be set multiple times. |
|
| 82 |
+ |
|
| 77 | 83 |
**--build-arg**=*variable* |
| 78 | 84 |
name and value of a **buildarg**. |
| 79 | 85 |
|