kitchen-docker 2.10.0 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df5438ae1f2f9b74072ba1c53c9b0c7876dd4abdd6e5cb864fddfa62c2bda75f
4
- data.tar.gz: 4e7531d5e26a6c7bceeb7cd14779e256cf2ebf21a866d1ea66f18957567c6623
3
+ metadata.gz: 5cb2a57e3f7074c1f3b07505f6931d9d742a2ff70d8908b97d9c69d27bb6b34b
4
+ data.tar.gz: 863c64c9dac8d43c0db30bb5b83cb6eaf3448ae0b988f9809abbd882b8b12ac1
5
5
  SHA512:
6
- metadata.gz: cafda9489c84bbbe7848ca36f777c33910a0696f52b78a1333cfe1ea9c1a7c9a89a9ec0ad1b674dc38141e03929886653bbe39424789294dc84d99d9a333c93f
7
- data.tar.gz: b5b121d05430ff88899cefe3d2754c00142f508237de92a9694919a5559227196b4d6d48651de6d7c620328207bea423e889671218c428e690fb59226e91e6c4
6
+ metadata.gz: b8639ed71230580894bc7daedd7c7efcaf09458e2e6c1cbf45e0617e16844a28d4c0015c251009e1e0fa0c741daf15715eed2a2bc6f1eada903a04fdb73a620a
7
+ data.tar.gz: 779683f5e429eff27d8d68c3a19f8d01b1247d9699f283bde06f902ed6a8a0f03330e534568cac05114676f27434ba0aacb443ad57705b0bb6e0c5a77409aba0
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
data/.gitignore CHANGED
@@ -17,5 +17,5 @@ test/version_tmp
17
17
  tmp
18
18
  .kitchen/
19
19
  .kitchen.local.yml
20
- Dockerfile*
20
+ Dockerfile
21
21
  .DS_Store
data/.kitchen.windows.yml CHANGED
@@ -18,7 +18,7 @@ provisioner:
18
18
  platforms:
19
19
  - name: windows
20
20
  driver_config:
21
- image: mcr.microsoft.com/windows/servercore:1803
21
+ image: mcr.microsoft.com/windows/servercore:1809
22
22
  platform: windows
23
23
 
24
24
  suites:
data/.kitchen.yml CHANGED
@@ -27,14 +27,11 @@ platforms:
27
27
  - name: oraclelinux-7
28
28
  - name: debian-8
29
29
  - name: debian-9
30
- - name: opensuse-42.3
31
- driver:
32
- image: opensuse/leap:42.3
33
- - name: opensuse/leap-42
34
- # - name: arch
35
- # driver:
36
- # image: base/archlinux
37
- # provision_command: true
30
+ # Removing opensuse CI tests temporarily due to an issue with the Chef install script not providing
31
+ # the correct platform name for opensuse resulting in consistent failures for this platform
32
+ #- name: opensuse-42.3
33
+ # driver:
34
+ # image: opensuse/leap:42.3
38
35
  - name: unknown
39
36
  driver:
40
37
  image: ubuntu:16.04
data/.travis.yml CHANGED
@@ -33,15 +33,20 @@ matrix:
33
33
  - os: windows
34
34
  language: bash
35
35
  install:
36
+ - choco uninstall ruby
37
+ - choco install ruby --version=2.6.5.1
38
+ - export PATH=$(echo "$PATH" | sed -e 's/:\/c\/tools\/ruby27\/bin//')
39
+ - export PATH=$PATH:/c/tools/ruby26/bin
36
40
  - choco install mingw
37
41
  - choco install msys2
38
- - ridk.cmd exec pacman -S --noconfirm --needed base-devel mingw-w64-x86_64-toolchain
42
+ - ridk.cmd exec pacman -S --noconfirm --needed base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-libxslt
39
43
  script:
40
- - taskkill -IM "gpg-agent.exe" -F
44
+ - if [[ $(tasklist | grep "gpg-agent") ]]; then taskkill -IM "gpg-agent.exe" -F; else echo "Process gpg-agent not found. Skipping."; fi
41
45
  - powershell -ExecutionPolicy Bypass -NoLogo -File docker.ps1
42
46
  - export KITCHEN_YAML=.kitchen.windows.yml
43
47
  - ruby -v
44
48
  - gem install bundler
49
+ - bundle config build.nokogiri --use-system-libraries
45
50
  - bundle install
46
51
  - bundle exec docker version
47
52
  - bundle exec kitchen --version
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Kitchen-Docker Changelog
2
2
 
3
+ ## 2.11.0 - July 2, 2021
4
+
5
+ * Update the development dependency on kitchen-inspec to 2.x
6
+ * Retrieve hostname state data after container is launched to avoid failures when `use_internal_docker_network` is set
7
+ * Add a new option for setting container isolation. See the readme for additional details
8
+ * Support GPUs in containers with a new `gpus` option that takes the same arguments that would be passed to `docker run --gpus`
9
+ * suse platform: use system script for ssh key initialization
10
+ * Add support for the `--mount` docker CLI option. See the readme for additional details
11
+ * Use sudo.d files instead of directly editing the sudoers file
12
+ * Allow passing `--tmpfs` entries to the docker run command. See the readme for additional details
13
+ * Use less verbose and quicker setup on Gentoo
14
+ * Lowercase the instance-name to avoid issues since docker does not allow instance with capital cases
15
+ * Fix the error "Could not parse Docker build output for image ID" by improving the output line matching
16
+ * Add support for `almalinux` & `rockylinux`
17
+
3
18
  ## 2.10.0 - Mar 28, 2020
4
19
 
5
20
  * Switched from require to require_relative to slightly improve load time performance
data/README.md CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  A Test Kitchen Driver and Transport for Docker.
9
9
 
10
+ ***MAINTAINERS WANTED***: This Test-Kitchen driver is currently without a maintainer and has many known issues. If you're interested in maintaining this driver for the long run including expanding the CI testing please reach out on [Chef Community Slack: #test-kitchen](https://chefcommunity.slack.com/archives/C2B6G1WCQ). Until such a time that this driver is maintained we highly recommend the [kitchen-dokken](https://github.com/test-kitchen/kitchen-dokken) for Chef Infra testing with Docker containers.
11
+
10
12
  ## Requirements
11
13
 
12
14
  * [Docker][docker_installation] **(>= 1.5)**
@@ -23,7 +25,7 @@ driver:
23
25
  name: docker
24
26
  env_variables:
25
27
  TEST_KEY: TEST_VALUE
26
-
28
+
27
29
  platforms:
28
30
  - name: ubuntu
29
31
  run_list:
@@ -109,8 +111,8 @@ Examples:
109
111
 
110
112
  ### socket
111
113
 
112
- The Docker daemon socket to use. By default, Docker will listen on `unix:///var/run/docker.sock` (On Windows, `npipe:////./pipe/docker_engine`),
113
- and no configuration here is required. If Docker is binding to another host/port or Unix socket, you will need to set this option.
114
+ The Docker daemon socket to use. By default, Docker will listen on `unix:///var/run/docker.sock` (On Windows, `npipe:////./pipe/docker_engine`),
115
+ and no configuration here is required. If Docker is binding to another host/port or Unix socket, you will need to set this option.
114
116
  If a TCP socket is set, its host will be used for SSH access to suite containers.
115
117
 
116
118
  Examples:
@@ -164,6 +166,19 @@ images using the [Docker Index][docker_index].
164
166
  The default will be computed, using the platform name (see the Default
165
167
  Configuration section for more details).
166
168
 
169
+ ### isolation
170
+
171
+ The isolation technology for the container. This is not set by default and will use the default container isolation settings.
172
+
173
+ For example, the following driver configuration options can be used to specify the container isolation technology for Windows containers:
174
+ ```yaml
175
+ # Hyper-V
176
+ isolation: hyperv
177
+
178
+ # Process
179
+ isolation: process
180
+ ```
181
+
167
182
  ### platform
168
183
 
169
184
  The platform of the chosen image. This is used to properly bootstrap the
@@ -171,7 +186,7 @@ suite container for Test Kitchen. Kitchen Docker currently supports:
171
186
 
172
187
  * `arch`
173
188
  * `debian` or `ubuntu`
174
- * `amazonlinux`, `rhel`, `centos`, `fedora` or `oraclelinux`
189
+ * `amazonlinux`, `rhel`, `centos`, `fedora`, `oraclelinux`, `almalinux` or `rockylinux`
175
190
  * `gentoo` or `gentoo-paludis`
176
191
  * `opensuse/tumbleweed`, `opensuse/leap`, `opensuse` or `sles`
177
192
  * `windows`
@@ -312,6 +327,39 @@ Examples:
312
327
  - rvm
313
328
  ```
314
329
 
330
+ ### mount
331
+
332
+ Attach a filesystem mount to the container (**NOTE:** supported only in docker
333
+ 17.05 and newer).
334
+
335
+ Examples:
336
+
337
+ ```yaml
338
+ mount: type=volume,source=my-volume,destination=/path/in/container
339
+ ```
340
+
341
+ ```yaml
342
+ mount:
343
+ - type=volume,source=my-volume,destination=/path/in/container
344
+ - type=tmpfs,tmpfs-size=512M,destination=/path/to/tmpdir
345
+ ```
346
+
347
+ ### tmpfs
348
+
349
+ Adds a tmpfs volume(s) to the suite container.
350
+
351
+ Examples:
352
+
353
+ ```yaml
354
+ tmpfs: /tmp
355
+ ```
356
+
357
+ ```yaml
358
+ tmpfs:
359
+ - /tmp:exec
360
+ - /run
361
+ ```
362
+
315
363
  ### dns
316
364
 
317
365
  Adjusts `resolv.conf` to use the dns servers specified. Otherwise use
@@ -587,7 +635,7 @@ limitations under the License.
587
635
  [docker_upstart_issue]: https://github.com/dotcloud/docker/issues/223
588
636
  [docker_index]: https://index.docker.io/
589
637
  [docker_default_image]: https://index.docker.io/_/base/
590
- [test_kitchen_docs]: http://kitchen.ci/docs/getting-started/
638
+ [test_kitchen_docs]: https://kitchen.ci/docs/getting-started/introduction/
591
639
  [chef_omnibus_dl]: https://downloads.chef.io/chef-client/
592
640
  [cpu_shares]: https://docs.fedoraproject.org/en-US/Fedora/17/html/Resource_Management_Guide/sec-cpu.html
593
641
  [memory_limit]: https://docs.fedoraproject.org/en-US/Fedora/17/html/Resource_Management_Guide/sec-memory.html
@@ -34,6 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_development_dependency 'codecov', '~> 0.0', '>= 0.0.2'
35
35
 
36
36
  # Integration testing gems.
37
- spec.add_development_dependency 'kitchen-inspec', '~> 1.1'
37
+ spec.add_development_dependency 'kitchen-inspec', '~> 2.0'
38
38
  spec.add_development_dependency 'train', '>= 2.1', '< 4.0' # validate 4.x when it's released
39
39
  end
@@ -37,13 +37,27 @@ module Kitchen
37
37
  end
38
38
 
39
39
  state[:username] = @config[:username]
40
- state[:hostname] = 'localhost'
40
+ end
41
+
42
+ def destroy(state)
43
+ info("[Docker] Destroying Docker container #{state[:container_id]}") if state[:container_id]
44
+ remove_container(state) if container_exists?(state)
45
+
46
+ if @config[:remove_images] && state[:image_id]
47
+ remove_image(state) if image_exists?(state)
48
+ end
49
+ end
50
+
51
+ def hostname(state)
52
+ hostname = 'localhost'
41
53
 
42
54
  if remote_socket?
43
- state[:hostname] = socket_uri.host
44
- elsif config[:use_internal_docker_network]
45
- state[:hostname] = container_ip_address(state)
55
+ hostname = socket_uri.host
56
+ elsif @config[:use_internal_docker_network]
57
+ hostname = container_ip_address(state)
46
58
  end
59
+
60
+ hostname
47
61
  end
48
62
 
49
63
  def upload(locals, remote)
@@ -56,15 +70,6 @@ module Kitchen
56
70
 
57
71
  files
58
72
  end
59
-
60
- def destroy(state)
61
- info("[Docker] Destroying Docker container #{state[:container_id]}") if state[:container_id]
62
- remove_container(state) if container_exists?(state)
63
-
64
- if @config[:remove_images] && state[:image_id]
65
- remove_image(state) if image_exists?(state)
66
- end
67
- end
68
73
  end
69
74
  end
70
75
  end
@@ -17,11 +17,14 @@ require 'securerandom'
17
17
  require 'shellwords'
18
18
 
19
19
  require_relative '../container'
20
+ require_relative '../helpers/dockerfile_helper'
20
21
 
21
22
  module Kitchen
22
23
  module Docker
23
24
  class Container
24
25
  class Linux < Kitchen::Docker::Container
26
+ include Kitchen::Docker::Helpers::DockerfileHelper
27
+
25
28
  MUTEX_FOR_SSH_KEYS = Mutex.new
26
29
 
27
30
  def initialize(config)
@@ -37,7 +40,7 @@ module Kitchen
37
40
  state[:ssh_key] = @config[:private_key]
38
41
  state[:image_id] = build_image(state, dockerfile) unless state[:image_id]
39
42
  state[:container_id] = run_container(state, 22) unless state[:container_id]
40
- state[:hostname] = 'localhost'
43
+ state[:hostname] = hostname(state)
41
44
  state[:port] = container_ssh_port(state)
42
45
  end
43
46
 
@@ -107,89 +110,11 @@ module Kitchen
107
110
  return dockerfile_template if @config[:dockerfile]
108
111
 
109
112
  from = "FROM #{@config[:image]}"
110
-
111
- platform = case @config[:platform]
112
- when 'debian', 'ubuntu'
113
- disable_upstart = <<-CODE
114
- RUN [ ! -f "/sbin/initctl" ] || dpkg-divert --local --rename --add /sbin/initctl && ln -sf /bin/true /sbin/initctl
115
- CODE
116
- packages = <<-CODE
117
- ENV DEBIAN_FRONTEND noninteractive
118
- ENV container docker
119
- RUN apt-get update
120
- RUN apt-get install -y sudo openssh-server curl lsb-release
121
- CODE
122
- @config[:disable_upstart] ? disable_upstart + packages : packages
123
- when 'rhel', 'centos', 'oraclelinux', 'amazonlinux'
124
- <<-CODE
125
- ENV container docker
126
- RUN yum clean all
127
- RUN yum install -y sudo openssh-server openssh-clients which curl
128
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
129
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
130
- CODE
131
- when 'fedora'
132
- <<-CODE
133
- ENV container docker
134
- RUN dnf clean all
135
- RUN dnf install -y sudo openssh-server openssh-clients which curl
136
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
137
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
138
- CODE
139
- when 'opensuse/tumbleweed', 'opensuse/leap', 'opensuse', 'sles'
140
- <<-CODE
141
- ENV container docker
142
- RUN zypper install -y sudo openssh which curl
143
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
144
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
145
- CODE
146
- when 'arch'
147
- # See https://bugs.archlinux.org/task/47052 for why we
148
- # blank out limits.conf.
149
- <<-CODE
150
- RUN pacman --noconfirm -Sy archlinux-keyring
151
- RUN pacman-db-upgrade
152
- RUN pacman --noconfirm -Syu openssl openssh sudo curl
153
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
154
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
155
- RUN echo >/etc/security/limits.conf
156
- CODE
157
- when 'gentoo'
158
- <<-CODE
159
- RUN emerge --sync
160
- RUN emerge net-misc/openssh app-admin/sudo
161
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
162
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
163
- CODE
164
- when 'gentoo-paludis'
165
- <<-CODE
166
- RUN cave sync
167
- RUN cave resolve -zx net-misc/openssh app-admin/sudo
168
- RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
169
- RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
170
- CODE
171
- else
172
- raise ActionFailed, "Unknown platform '#{@config[:platform]}'"
173
- end
174
-
113
+ platform = dockerfile_platform
175
114
  username = @config[:username]
176
115
  public_key = IO.read(@config[:public_key]).strip
177
116
  homedir = username == 'root' ? '/root' : "/home/#{username}"
178
-
179
- base = <<-CODE
180
- RUN if ! getent passwd #{username}; then \
181
- useradd -d #{homedir} -m -s /bin/bash -p '*' #{username}; \
182
- fi
183
- RUN echo "#{username} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
184
- RUN echo "Defaults !requiretty" >> /etc/sudoers
185
- RUN mkdir -p #{homedir}/.ssh
186
- RUN chown -R #{username} #{homedir}/.ssh
187
- RUN chmod 0700 #{homedir}/.ssh
188
- RUN touch #{homedir}/.ssh/authorized_keys
189
- RUN chown #{username} #{homedir}/.ssh/authorized_keys
190
- RUN chmod 0600 #{homedir}/.ssh/authorized_keys
191
- RUN mkdir -p /run/sshd
192
- CODE
117
+ base = dockerfile_base_linux(username, homedir)
193
118
 
194
119
  custom = ''
195
120
  Array(@config[:provision_command]).each do |cmd|
@@ -30,6 +30,7 @@ module Kitchen
30
30
  state[:username] = @config[:username]
31
31
  state[:image_id] = build_image(state, dockerfile) unless state[:image_id]
32
32
  state[:container_id] = run_container(state) unless state[:container_id]
33
+ state[:hostname] = hostname(state)
33
34
  end
34
35
 
35
36
  def execute(command)
@@ -16,6 +16,6 @@
16
16
  module Kitchen
17
17
  module Docker
18
18
  # Version string for Docker Kitchen driver
19
- DOCKER_VERSION = "2.10.0"
19
+ DOCKER_VERSION = "2.11.0"
20
20
  end
21
21
  end
@@ -49,14 +49,18 @@ module Kitchen
49
49
  Array(config[:volumes_from]).each { |container| cmd << " --volumes-from #{container}" }
50
50
  Array(config[:links]).each { |link| cmd << " --link #{link}" }
51
51
  Array(config[:devices]).each { |device| cmd << " --device #{device}" }
52
+ Array(config[:mount]).each {|mount| cmd << " --mount #{mount}"}
53
+ Array(config[:tmpfs]).each {|tmpfs| cmd << " --tmpfs #{tmpfs}"}
52
54
  cmd << " --name #{config[:instance_name]}" if config[:instance_name]
53
55
  cmd << ' -P' if config[:publish_all]
54
56
  cmd << " -h #{config[:hostname]}" if config[:hostname]
55
57
  cmd << " -m #{config[:memory]}" if config[:memory]
56
58
  cmd << " -c #{config[:cpu]}" if config[:cpu]
59
+ cmd << " --gpus #{config[:gpus]}" if config[:gpus]
57
60
  cmd << " -e http_proxy=#{config[:http_proxy]}" if config[:http_proxy]
58
61
  cmd << " -e https_proxy=#{config[:https_proxy]}" if config[:https_proxy]
59
62
  cmd << ' --privileged' if config[:privileged]
63
+ cmd << " --isolation #{config[:isolation]}" if config[:isolation]
60
64
  Array(config[:cap_add]).each { |cap| cmd << " --cap-add=#{cap}"} if config[:cap_add]
61
65
  Array(config[:cap_drop]).each { |cap| cmd << " --cap-drop=#{cap}"} if config[:cap_drop]
62
66
  Array(config[:security_opt]).each { |opt| cmd << " --security-opt=#{opt}"} if config[:security_opt]
@@ -0,0 +1,136 @@
1
+ #
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ require 'kitchen'
15
+ require 'kitchen/configurable'
16
+
17
+ module Kitchen
18
+ module Docker
19
+ module Helpers
20
+ module DockerfileHelper
21
+ include Configurable
22
+
23
+ def dockerfile_platform
24
+ case config[:platform]
25
+ when 'arch'
26
+ arch_platform
27
+ when 'debian', 'ubuntu'
28
+ debian_platform
29
+ when 'fedora'
30
+ fedora_platform
31
+ when 'gentoo'
32
+ gentoo_platform
33
+ when 'gentoo-paludis'
34
+ gentoo_paludis_platform
35
+ when 'opensuse/tumbleweed', 'opensuse/leap', 'opensuse', 'sles'
36
+ opensuse_platform
37
+ when 'rhel', 'centos', 'oraclelinux', 'amazonlinux', 'almalinux', 'rockylinux'
38
+ rhel_platform
39
+ else
40
+ raise ActionFailed, "Unknown platform '#{config[:platform]}'"
41
+ end
42
+ end
43
+
44
+ def arch_platform
45
+ # See https://bugs.archlinux.org/task/47052 for why we
46
+ # blank out limits.conf.
47
+ <<-CODE
48
+ RUN pacman --noconfirm -Sy archlinux-keyring
49
+ RUN pacman-db-upgrade
50
+ RUN pacman --noconfirm -Syu openssl openssh sudo curl
51
+ RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
52
+ RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
53
+ RUN echo >/etc/security/limits.conf
54
+ CODE
55
+ end
56
+
57
+ def debian_platform
58
+ disable_upstart = <<-CODE
59
+ RUN [ ! -f "/sbin/initctl" ] || dpkg-divert --local --rename --add /sbin/initctl \
60
+ && ln -sf /bin/true /sbin/initctl
61
+ CODE
62
+ packages = <<-CODE
63
+ ENV DEBIAN_FRONTEND noninteractive
64
+ ENV container docker
65
+ RUN apt-get update
66
+ RUN apt-get install -y sudo openssh-server curl lsb-release
67
+ CODE
68
+ config[:disable_upstart] ? disable_upstart + packages : packages
69
+ end
70
+
71
+ def fedora_platform
72
+ <<-CODE
73
+ ENV container docker
74
+ RUN dnf clean all
75
+ RUN dnf install -y sudo openssh-server openssh-clients which curl
76
+ RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
77
+ RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
78
+ CODE
79
+ end
80
+
81
+ def gentoo_platform
82
+ <<-CODE
83
+ RUN emerge-webrsync
84
+ RUN emerge --quiet --noreplace net-misc/openssh app-admin/sudo
85
+ RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
86
+ RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
87
+ CODE
88
+ end
89
+
90
+ def gentoo_paludis_platform
91
+ <<-CODE
92
+ RUN cave sync
93
+ RUN cave resolve -zx net-misc/openssh app-admin/sudo
94
+ RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
95
+ RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
96
+ CODE
97
+ end
98
+
99
+ def opensuse_platform
100
+ <<-CODE
101
+ ENV container docker
102
+ RUN zypper install -y sudo openssh which curl
103
+ RUN /usr/sbin/sshd-gen-keys-start
104
+ CODE
105
+ end
106
+
107
+ def rhel_platform
108
+ <<-CODE
109
+ ENV container docker
110
+ RUN yum clean all
111
+ RUN yum install -y sudo openssh-server openssh-clients which curl
112
+ RUN [ -f "/etc/ssh/ssh_host_rsa_key" ] || ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
113
+ RUN [ -f "/etc/ssh/ssh_host_dsa_key" ] || ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
114
+ CODE
115
+ end
116
+
117
+ def dockerfile_base_linux(username, homedir)
118
+ <<-CODE
119
+ RUN if ! getent passwd #{username}; then \
120
+ useradd -d #{homedir} -m -s /bin/bash -p '*' #{username}; \
121
+ fi
122
+ RUN echo "#{username} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/#{username}
123
+ RUN echo "Defaults !requiretty" >> /etc/sudoers.d/#{username}
124
+ RUN mkdir -p #{homedir}/.ssh
125
+ RUN chown -R #{username} #{homedir}/.ssh
126
+ RUN chmod 0700 #{homedir}/.ssh
127
+ RUN touch #{homedir}/.ssh/authorized_keys
128
+ RUN chown #{username} #{homedir}/.ssh/authorized_keys
129
+ RUN chmod 0600 #{homedir}/.ssh/authorized_keys
130
+ RUN mkdir -p /run/sshd
131
+ CODE
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -26,8 +26,9 @@ module Kitchen
26
26
 
27
27
  def parse_image_id(output)
28
28
  output.each_line do |line|
29
- if line =~ /image id|build successful|successfully built/i
30
- return line.split(/\s+/).last
29
+ if line =~ /image id|build successful|successfully built|writing image/i
30
+ img_id = line.split(/\s+/).last
31
+ return img_id
31
32
  end
32
33
  end
33
34
  raise ActionFailed, 'Could not parse Docker build output for image ID'
@@ -50,7 +51,8 @@ module Kitchen
50
51
  file.write(dockerfile)
51
52
  file.close
52
53
  docker_command("#{cmd} -f #{Shellwords.escape(dockerfile_path(file))} #{build_context}",
53
- input: dockerfile_contents)
54
+ input: dockerfile_contents,
55
+ environment: { DOCKER_BUILDKIT: '0' })
54
56
  ensure
55
57
  file.close unless file.closed?
56
58
  file.unlink
@@ -1,164 +1,165 @@
1
- #
2
- # Copyright (C) 2014, Sean Porter
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- require 'kitchen'
17
- require 'json'
18
- require 'securerandom'
19
- require 'net/ssh'
20
-
21
- require 'kitchen/driver/base'
22
-
23
- require_relative '../docker/container/linux'
24
- require_relative '../docker/container/windows'
25
- require_relative '../docker/helpers/cli_helper'
26
- require_relative '../docker/helpers/container_helper'
27
-
28
- module Kitchen
29
- module Driver
30
- # Docker driver for Kitchen.
31
- #
32
- # @author Sean Porter <portertech@gmail.com>
33
- class Docker < Kitchen::Driver::Base
34
- include Kitchen::Docker::Helpers::CliHelper
35
- include Kitchen::Docker::Helpers::ContainerHelper
36
- include ShellOut
37
-
38
- default_config :binary, 'docker'
39
- default_config :build_options, nil
40
- default_config :cap_add, nil
41
- default_config :cap_drop, nil
42
- default_config :disable_upstart, true
43
- default_config :env_variables, nil
44
- default_config :interactive, false
45
- default_config :private_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa')
46
- default_config :privileged, false
47
- default_config :public_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa.pub')
48
- default_config :publish_all, false
49
- default_config :remove_images, false
50
- default_config :run_options, nil
51
- default_config :security_opt, nil
52
- default_config :tls, false
53
- default_config :tls_cacert, nil
54
- default_config :tls_cert, nil
55
- default_config :tls_key, nil
56
- default_config :tls_verify, false
57
- default_config :tty, false
58
- default_config :use_cache, true
59
- default_config :use_internal_docker_network, false
60
- default_config :use_sudo, false
61
- default_config :wait_for_transport, true
62
-
63
- default_config :build_context do |driver|
64
- !driver.remote_socket?
65
- end
66
-
67
- default_config :image do |driver|
68
- driver.default_image
69
- end
70
-
71
- default_config :instance_name do |driver|
72
- # Borrowed from kitchen-rackspace
73
- [
74
- driver.instance.name.gsub(/\W/, ''),
75
- (Etc.getlogin || 'nologin').gsub(/\W/, ''),
76
- Socket.gethostname.gsub(/\W/, '')[0..20],
77
- Array.new(8) { rand(36).to_s(36) }.join
78
- ].join('-')
79
- end
80
-
81
- default_config :platform do |driver|
82
- driver.default_platform
83
- end
84
-
85
- default_config :run_command do |driver|
86
- if driver.windows_os?
87
- # Launch arbitrary process to keep the Windows container alive
88
- # If running in interactive mode, launch powershell.exe instead
89
- if driver[:interactive]
90
- 'powershell.exe'
91
- else
92
- 'ping -t localhost'
93
- end
94
- else
95
- '/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes '\
96
- '-o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid'
97
- end
98
- end
99
-
100
- default_config :socket do |driver|
101
- socket = 'unix:///var/run/docker.sock'
102
- socket = 'npipe:////./pipe/docker_engine' if driver.windows_os?
103
- ENV['DOCKER_HOST'] || socket
104
- end
105
-
106
- default_config :username do |driver|
107
- # Return nil to prevent username from being added to Docker
108
- # command line args for Windows if a username was not specified
109
- if driver.windows_os?
110
- nil
111
- else
112
- 'kitchen'
113
- end
114
- end
115
-
116
- def verify_dependencies
117
- run_command("#{config[:binary]} >> #{dev_null} 2>&1", quiet: true, use_sudo: config[:use_sudo])
118
- rescue
119
- raise UserError, 'You must first install the Docker CLI tool https://www.docker.com/get-started'
120
- end
121
-
122
- def create(state)
123
- container.create(state)
124
-
125
- wait_for_transport(state)
126
- end
127
-
128
- def destroy(state)
129
- container.destroy(state)
130
- end
131
-
132
- def wait_for_transport(state)
133
- if config[:wait_for_transport]
134
- instance.transport.connection(state) do |conn|
135
- conn.wait_until_ready
136
- end
137
- end
138
- end
139
-
140
- def default_image
141
- platform, release = instance.platform.name.split('-')
142
- if platform == 'centos' && release
143
- release = 'centos' + release.split('.').first
144
- end
145
- release ? [platform, release].join(':') : platform
146
- end
147
-
148
- def default_platform
149
- instance.platform.name.split('-').first
150
- end
151
-
152
- protected
153
-
154
- def container
155
- @container ||= if windows_os?
156
- Kitchen::Docker::Container::Windows.new(config)
157
- else
158
- Kitchen::Docker::Container::Linux.new(config)
159
- end
160
- @container
161
- end
162
- end
163
- end
164
- end
1
+ #
2
+ # Copyright (C) 2014, Sean Porter
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'kitchen'
17
+ require 'json'
18
+ require 'securerandom'
19
+ require 'net/ssh'
20
+
21
+ require 'kitchen/driver/base'
22
+
23
+ require_relative '../docker/container/linux'
24
+ require_relative '../docker/container/windows'
25
+ require_relative '../docker/helpers/cli_helper'
26
+ require_relative '../docker/helpers/container_helper'
27
+
28
+ module Kitchen
29
+ module Driver
30
+ # Docker driver for Kitchen.
31
+ #
32
+ # @author Sean Porter <portertech@gmail.com>
33
+ class Docker < Kitchen::Driver::Base
34
+ include Kitchen::Docker::Helpers::CliHelper
35
+ include Kitchen::Docker::Helpers::ContainerHelper
36
+ include ShellOut
37
+
38
+ default_config :binary, 'docker'
39
+ default_config :build_options, nil
40
+ default_config :cap_add, nil
41
+ default_config :cap_drop, nil
42
+ default_config :disable_upstart, true
43
+ default_config :env_variables, nil
44
+ default_config :isolation, nil
45
+ default_config :interactive, false
46
+ default_config :private_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa')
47
+ default_config :privileged, false
48
+ default_config :public_key, File.join(Dir.pwd, '.kitchen', 'docker_id_rsa.pub')
49
+ default_config :publish_all, false
50
+ default_config :remove_images, false
51
+ default_config :run_options, nil
52
+ default_config :security_opt, nil
53
+ default_config :tls, false
54
+ default_config :tls_cacert, nil
55
+ default_config :tls_cert, nil
56
+ default_config :tls_key, nil
57
+ default_config :tls_verify, false
58
+ default_config :tty, false
59
+ default_config :use_cache, true
60
+ default_config :use_internal_docker_network, false
61
+ default_config :use_sudo, false
62
+ default_config :wait_for_transport, true
63
+
64
+ default_config :build_context do |driver|
65
+ !driver.remote_socket?
66
+ end
67
+
68
+ default_config :image do |driver|
69
+ driver.default_image
70
+ end
71
+
72
+ default_config :instance_name do |driver|
73
+ # Borrowed from kitchen-rackspace
74
+ [
75
+ driver.instance.name.gsub(/\W/, ''),
76
+ (Etc.getlogin || 'nologin').gsub(/\W/, ''),
77
+ Socket.gethostname.gsub(/\W/, '')[0..20],
78
+ Array.new(8) { rand(36).to_s(36) }.join
79
+ ].join('-').downcase
80
+ end
81
+
82
+ default_config :platform do |driver|
83
+ driver.default_platform
84
+ end
85
+
86
+ default_config :run_command do |driver|
87
+ if driver.windows_os?
88
+ # Launch arbitrary process to keep the Windows container alive
89
+ # If running in interactive mode, launch powershell.exe instead
90
+ if driver[:interactive]
91
+ 'powershell.exe'
92
+ else
93
+ 'ping -t localhost'
94
+ end
95
+ else
96
+ '/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o PasswordAuthentication=yes '\
97
+ '-o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid'
98
+ end
99
+ end
100
+
101
+ default_config :socket do |driver|
102
+ socket = 'unix:///var/run/docker.sock'
103
+ socket = 'npipe:////./pipe/docker_engine' if driver.windows_os?
104
+ ENV['DOCKER_HOST'] || socket
105
+ end
106
+
107
+ default_config :username do |driver|
108
+ # Return nil to prevent username from being added to Docker
109
+ # command line args for Windows if a username was not specified
110
+ if driver.windows_os?
111
+ nil
112
+ else
113
+ 'kitchen'
114
+ end
115
+ end
116
+
117
+ def verify_dependencies
118
+ run_command("#{config[:binary]} >> #{dev_null} 2>&1", quiet: true, use_sudo: config[:use_sudo])
119
+ rescue
120
+ raise UserError, 'You must first install the Docker CLI tool https://www.docker.com/get-started'
121
+ end
122
+
123
+ def create(state)
124
+ container.create(state)
125
+
126
+ wait_for_transport(state)
127
+ end
128
+
129
+ def destroy(state)
130
+ container.destroy(state)
131
+ end
132
+
133
+ def wait_for_transport(state)
134
+ if config[:wait_for_transport]
135
+ instance.transport.connection(state) do |conn|
136
+ conn.wait_until_ready
137
+ end
138
+ end
139
+ end
140
+
141
+ def default_image
142
+ platform, release = instance.platform.name.split('-')
143
+ if platform == 'centos' && release
144
+ release = 'centos' + release.split('.').first
145
+ end
146
+ release ? [platform, release].join(':') : platform
147
+ end
148
+
149
+ def default_platform
150
+ instance.platform.name.split('-').first
151
+ end
152
+
153
+ protected
154
+
155
+ def container
156
+ @container ||= if windows_os?
157
+ Kitchen::Docker::Container::Windows.new(config)
158
+ else
159
+ Kitchen::Docker::Container::Linux.new(config)
160
+ end
161
+ @container
162
+ end
163
+ end
164
+ end
165
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-docker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Porter
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-28 00:00:00.000000000 Z
11
+ date: 2021-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -176,14 +176,14 @@ dependencies:
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: '1.1'
179
+ version: '2.0'
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - "~>"
185
185
  - !ruby/object:Gem::Version
186
- version: '1.1'
186
+ version: '2.0'
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: train
189
189
  requirement: !ruby/object:Gem::Requirement
@@ -212,6 +212,7 @@ extensions: []
212
212
  extra_rdoc_files: []
213
213
  files:
214
214
  - ".cane"
215
+ - ".github/dependabot.yml"
215
216
  - ".gitignore"
216
217
  - ".kitchen.windows.yml"
217
218
  - ".kitchen.yml"
@@ -232,6 +233,7 @@ files:
232
233
  - lib/kitchen/docker/erb_context.rb
233
234
  - lib/kitchen/docker/helpers/cli_helper.rb
234
235
  - lib/kitchen/docker/helpers/container_helper.rb
236
+ - lib/kitchen/docker/helpers/dockerfile_helper.rb
235
237
  - lib/kitchen/docker/helpers/file_helper.rb
236
238
  - lib/kitchen/docker/helpers/image_helper.rb
237
239
  - lib/kitchen/docker/helpers/inspec_helper.rb
@@ -249,7 +251,7 @@ homepage: https://github.com/test-kitchen/kitchen-docker
249
251
  licenses:
250
252
  - Apache 2.0
251
253
  metadata: {}
252
- post_install_message:
254
+ post_install_message:
253
255
  rdoc_options: []
254
256
  require_paths:
255
257
  - lib
@@ -264,8 +266,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
266
  - !ruby/object:Gem::Version
265
267
  version: '0'
266
268
  requirements: []
267
- rubygems_version: 3.1.2
268
- signing_key:
269
+ rubygems_version: 3.2.15
270
+ signing_key:
269
271
  specification_version: 4
270
272
  summary: A Docker Driver for Test Kitchen
271
273
  test_files: