2014-02-26 00:17:48 +08:00
package main
import (
2014-04-18 10:24:19 +08:00
"strings"
2015-04-19 00:46:47 +08:00
2018-05-05 05:15:00 +08:00
"github.com/docker/docker/api/types/versions"
2016-12-31 01:23:00 +08:00
"github.com/docker/docker/integration-cli/checker"
2017-03-24 01:35:22 +08:00
"github.com/docker/docker/integration-cli/cli"
2015-04-19 00:46:47 +08:00
"github.com/go-check/check"
2014-02-26 00:17:48 +08:00
)
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitAfterContainerIsDone ( c * check . C ) {
2017-03-24 01:35:22 +08:00
out := cli . DockerCmd ( c , "run" , "-i" , "-a" , "stdin" , "busybox" , "echo" , "foo" ) . Combined ( )
2014-02-26 00:17:48 +08:00
2015-04-06 21:21:18 +08:00
cleanedContainerID := strings . TrimSpace ( out )
2014-02-26 00:17:48 +08:00
2017-03-24 01:35:22 +08:00
cli . DockerCmd ( c , "wait" , cleanedContainerID )
2014-02-26 00:17:48 +08:00
2017-03-24 01:35:22 +08:00
out = cli . DockerCmd ( c , "commit" , cleanedContainerID ) . Combined ( )
2014-02-26 00:17:48 +08:00
2015-04-06 21:21:18 +08:00
cleanedImageID := strings . TrimSpace ( out )
2014-02-26 00:17:48 +08:00
2017-03-24 01:35:22 +08:00
cli . DockerCmd ( c , "inspect" , cleanedImageID )
2014-06-08 14:37:31 +08:00
}
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitWithoutPause ( c * check . C ) {
2015-08-29 01:36:42 +08:00
testRequires ( c , DaemonIsLinux )
2015-07-14 14:35:36 +08:00
out , _ := dockerCmd ( c , "run" , "-i" , "-a" , "stdin" , "busybox" , "echo" , "foo" )
2014-06-08 14:37:31 +08:00
2015-04-06 21:21:18 +08:00
cleanedContainerID := strings . TrimSpace ( out )
2014-06-08 14:37:31 +08:00
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "wait" , cleanedContainerID )
2014-06-08 14:37:31 +08:00
2015-07-14 14:35:36 +08:00
out , _ = dockerCmd ( c , "commit" , "-p=false" , cleanedContainerID )
2014-06-08 14:37:31 +08:00
2015-04-06 21:21:18 +08:00
cleanedImageID := strings . TrimSpace ( out )
2014-06-08 14:37:31 +08:00
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "inspect" , cleanedImageID )
2014-02-26 00:17:48 +08:00
}
2014-04-18 10:24:19 +08:00
2015-02-24 19:28:40 +08:00
//test commit a paused container should not unpause it after commit
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitPausedContainer ( c * check . C ) {
2015-08-29 01:36:42 +08:00
testRequires ( c , DaemonIsLinux )
2015-07-14 14:35:36 +08:00
out , _ := dockerCmd ( c , "run" , "-i" , "-d" , "busybox" )
2015-02-24 19:28:40 +08:00
2015-04-06 21:21:18 +08:00
cleanedContainerID := strings . TrimSpace ( out )
2015-02-24 19:28:40 +08:00
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "pause" , cleanedContainerID )
2018-07-10 01:40:34 +08:00
dockerCmd ( c , "commit" , cleanedContainerID )
2015-02-24 19:28:40 +08:00
2016-01-28 22:19:25 +08:00
out = inspectField ( c , cleanedContainerID , "State.Paused" )
2015-10-17 05:48:51 +08:00
// commit should not unpause a paused container
2019-09-10 05:05:55 +08:00
assert . Assert ( c , out , checker . Contains , "true" )
2015-02-24 19:28:40 +08:00
}
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitNewFile ( c * check . C ) {
2017-05-22 07:24:07 +08:00
dockerCmd ( c , "run" , "--name" , "committer" , "busybox" , "/bin/sh" , "-c" , "echo koye > /foo" )
2014-04-18 10:24:19 +08:00
2017-05-22 07:24:07 +08:00
imageID , _ := dockerCmd ( c , "commit" , "committer" )
2015-10-17 05:48:51 +08:00
imageID = strings . TrimSpace ( imageID )
2014-04-18 10:24:19 +08:00
2015-07-14 14:35:36 +08:00
out , _ := dockerCmd ( c , "run" , imageID , "cat" , "/foo" )
2015-10-17 05:48:51 +08:00
actual := strings . TrimSpace ( out )
2019-09-10 05:05:55 +08:00
assert . Assert ( c , actual , checker . Equals , "koye" )
2014-04-18 10:24:19 +08:00
}
2014-03-28 03:16:03 +08:00
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitHardlink ( c * check . C ) {
2015-08-29 01:36:42 +08:00
testRequires ( c , DaemonIsLinux )
2015-07-14 14:35:36 +08:00
firstOutput , _ := dockerCmd ( c , "run" , "-t" , "--name" , "hardlinks" , "busybox" , "sh" , "-c" , "touch file1 && ln file1 file2 && ls -di file1 file2" )
2014-09-16 02:45:53 +08:00
2015-07-14 14:35:36 +08:00
chunks := strings . Split ( strings . TrimSpace ( firstOutput ) , " " )
2014-09-16 02:45:53 +08:00
inode := chunks [ 0 ]
2015-10-17 05:48:51 +08:00
chunks = strings . SplitAfterN ( strings . TrimSpace ( firstOutput ) , " " , 2 )
2019-09-10 05:05:55 +08:00
assert . Assert ( c , chunks [ 1 ] , checker . Contains , chunks [ 0 ] , check . Commentf ( "Failed to create hardlink in a container. Expected to find %q in %q" , inode , chunks [ 1 : ] ) )
2014-09-16 02:45:53 +08:00
2015-07-14 14:35:36 +08:00
imageID , _ := dockerCmd ( c , "commit" , "hardlinks" , "hardlinks" )
2015-10-17 05:48:51 +08:00
imageID = strings . TrimSpace ( imageID )
2014-09-16 02:45:53 +08:00
2017-01-18 10:08:31 +08:00
secondOutput , _ := dockerCmd ( c , "run" , "-t" , imageID , "ls" , "-di" , "file1" , "file2" )
2014-09-16 02:45:53 +08:00
2015-07-14 14:35:36 +08:00
chunks = strings . Split ( strings . TrimSpace ( secondOutput ) , " " )
2014-09-16 02:45:53 +08:00
inode = chunks [ 0 ]
2015-10-17 05:48:51 +08:00
chunks = strings . SplitAfterN ( strings . TrimSpace ( secondOutput ) , " " , 2 )
2019-09-10 05:05:55 +08:00
assert . Assert ( c , chunks [ 1 ] , checker . Contains , chunks [ 0 ] , check . Commentf ( "Failed to create hardlink in a container. Expected to find %q in %q" , inode , chunks [ 1 : ] ) )
2014-09-16 02:45:53 +08:00
}
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitTTY ( c * check . C ) {
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "run" , "-t" , "--name" , "tty" , "busybox" , "/bin/ls" )
2014-03-28 03:16:03 +08:00
2015-07-14 14:35:36 +08:00
imageID , _ := dockerCmd ( c , "commit" , "tty" , "ttytest" )
2015-10-17 05:48:51 +08:00
imageID = strings . TrimSpace ( imageID )
2014-03-28 03:16:03 +08:00
2017-01-18 10:08:31 +08:00
dockerCmd ( c , "run" , imageID , "/bin/ls" )
2014-03-28 03:16:03 +08:00
}
2014-05-20 06:57:29 +08:00
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitWithHostBindMount ( c * check . C ) {
2015-08-29 01:36:42 +08:00
testRequires ( c , DaemonIsLinux )
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "run" , "--name" , "bind-commit" , "-v" , "/dev/null:/winning" , "busybox" , "true" )
2014-10-15 02:26:53 +08:00
2015-07-14 14:35:36 +08:00
imageID , _ := dockerCmd ( c , "commit" , "bind-commit" , "bindtest" )
2015-10-17 05:48:51 +08:00
imageID = strings . TrimSpace ( imageID )
2014-05-20 06:57:29 +08:00
2017-01-18 10:08:31 +08:00
dockerCmd ( c , "run" , imageID , "true" )
2014-05-20 06:57:29 +08:00
}
2014-10-01 17:35:44 +08:00
2015-04-19 00:46:47 +08:00
func ( s * DockerSuite ) TestCommitChange ( c * check . C ) {
2015-07-14 14:35:36 +08:00
dockerCmd ( c , "run" , "--name" , "test" , "busybox" , "true" )
2015-02-05 19:26:05 +08:00
2015-07-14 14:35:36 +08:00
imageID , _ := dockerCmd ( c , "commit" ,
2014-10-01 17:35:44 +08:00
"--change" , "EXPOSE 8080" ,
"--change" , "ENV DEBUG true" ,
2015-01-13 03:52:44 +08:00
"--change" , "ENV test 1" ,
2015-02-25 16:04:46 +08:00
"--change" , "ENV PATH /foo" ,
2015-06-04 21:47:55 +08:00
"--change" , "LABEL foo bar" ,
"--change" , "CMD [\"/bin/sh\"]" ,
"--change" , "WORKDIR /opt" ,
"--change" , "ENTRYPOINT [\"/bin/sh\"]" ,
"--change" , "USER testuser" ,
"--change" , "VOLUME /var/lib/docker" ,
"--change" , "ONBUILD /usr/local/bin/python-build --dir /app/src" ,
2014-10-01 17:35:44 +08:00
"test" , "test-commit" )
2015-10-17 05:48:51 +08:00
imageID = strings . TrimSpace ( imageID )
2014-10-01 17:35:44 +08:00
2018-05-05 05:15:00 +08:00
expectedEnv := "[DEBUG=true test=1 PATH=/foo]"
// bug fixed in 1.36, add min APi >= 1.36 requirement
// PR record https://github.com/moby/moby/pull/35582
if versions . GreaterThan ( testEnv . DaemonAPIVersion ( ) , "1.35" ) && testEnv . OSType != "windows" {
// The ordering here is due to `PATH` being overridden from the container's
// ENV. On windows, the container doesn't have a `PATH` ENV variable so
// the ordering is the same as the cli.
expectedEnv = "[PATH=/foo DEBUG=true test=1]"
2017-11-23 05:31:26 +08:00
}
2016-11-17 07:02:27 +08:00
prefix , slash := getPrefixAndSlashFromDaemonPlatform ( )
2017-08-23 06:25:31 +08:00
prefix = strings . ToUpper ( prefix ) // Force C: as that's how WORKDIR is normalized on Windows
2014-10-01 17:35:44 +08:00
expected := map [ string ] string {
2015-03-27 03:43:00 +08:00
"Config.ExposedPorts" : "map[8080/tcp:{}]" ,
2017-11-23 05:31:26 +08:00
"Config.Env" : expectedEnv ,
2015-06-04 21:47:55 +08:00
"Config.Labels" : "map[foo:bar]" ,
2016-02-29 19:28:37 +08:00
"Config.Cmd" : "[/bin/sh]" ,
2016-11-17 07:02:27 +08:00
"Config.WorkingDir" : prefix + slash + "opt" ,
2016-02-29 19:28:37 +08:00
"Config.Entrypoint" : "[/bin/sh]" ,
2015-06-04 21:47:55 +08:00
"Config.User" : "testuser" ,
"Config.Volumes" : "map[/var/lib/docker:{}]" ,
"Config.OnBuild" : "[/usr/local/bin/python-build --dir /app/src]" ,
2014-10-01 17:35:44 +08:00
}
for conf , value := range expected {
2016-01-28 22:19:25 +08:00
res := inspectField ( c , imageID , conf )
2014-10-01 17:35:44 +08:00
if res != value {
2015-04-19 00:46:47 +08:00
c . Errorf ( "%s('%s'), expected %s" , conf , res , value )
2014-10-01 17:35:44 +08:00
}
}
}
2016-12-20 01:56:20 +08:00
func ( s * DockerSuite ) TestCommitChangeLabels ( c * check . C ) {
dockerCmd ( c , "run" , "--name" , "test" , "--label" , "some=label" , "busybox" , "true" )
imageID , _ := dockerCmd ( c , "commit" ,
"--change" , "LABEL some=label2" ,
"test" , "test-commit" )
imageID = strings . TrimSpace ( imageID )
2019-09-10 05:05:55 +08:00
assert . Assert ( c , inspectField ( c , imageID , "Config.Labels" ) , checker . Equals , "map[some:label2]" )
2016-12-20 01:56:20 +08:00
// check that container labels didn't change
2019-09-10 05:05:55 +08:00
assert . Assert ( c , inspectField ( c , "test" , "Config.Labels" ) , checker . Equals , "map[some:label]" )
2016-12-20 01:56:20 +08:00
}