繁体   English   中英

如何在测试容器上使用docker-compose.yml时修复挂载问题

[英]How fix mounting issue while using docker-compose.yml on test containers

我正在使用测试容器运行一些测试并使用https://www.testcontainers.org/modules/docker_compose/来旋转一些用于我的测试的容器。 与通用容器支持类似,也可以运行docker-compose.yml文件中指定的定制服务集。

这对于已在dev或其他环境中使用Docker Compose来定义应用程序可能依赖的服务的项目非常有用。

这是我的代码,包括docker-compose.yml

@ClassRule
public static DockerComposeContainer environment =
    new DockerComposeContainer(new File("src/test/resources/docker-compose.yml"));

这是我的yml文件的内容:

version: '2.0'
services:

  vault:
    image: vault:0.10.2
    container_name: vault
    ports:
      - "8200:8200"
    environment:
      - VAULT_ADDR=http://0.0.0.0:8200
      - VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200
      - VAULT_DEV_ROOT_TOKEN_ID=stupid-token
    volumes:
      - /config/vault/start.sh:/start.sh
    command: sh -c "./start.sh"

  consul:
    image: consul:0.8.5
    container_name: consul
    ports:
      - "8300:8300"
      - "8400:8400"
      - "8500:8500"
      - "8600:8600"
      - "8600:8600/udp"
    environment:
      - SERVICE_IGNORE=true
    entrypoint: sh -c "BIND_HOST=$$(echo \"$DOCKER_HOST\" | awk -F ':' '{print $$2}' | sed  's/\\/\\///'); echo $$BIND_HOST;/bin/consul agent -server -bootstrap  --client=0.0.0.0 --data-dir=/tmp/consul -ui -advertise=$$BIND_HOST -domain=consul-dev"

  registrator:
    image: gliderlabs/registrator:v7
    container_name: registrator
    depends_on:
      - consul
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    entrypoint: sh -c "BIND_HOST=$$(echo \"$DOCKER_HOST\" | awk -F ':' '{print $$2}' | sed  's/\\/\\///'); echo $$BIND_HOST;/bin/registrator -ip $$BIND_HOST consul://consul:8500"

  postgres:
    image: registry.xxx.com/xxx-postgres:9.5.9
    container_name: postgres
    ports:
      - "5432:5432"
    depends_on:
      - registrator
    volumes:
      - /config/postgres/docker-entrypoint.sh:/docker-entrypoint.sh:ro
#      - postgres-data:/var/lib/postgresql/data
    environment:
      - SERVICE_NAME=postgres
    command: -c max_connections=4000

  test-dbmigrate:
    image: registry.xxx.com/test-db:master
    container_name: test-dbmigrate
    depends_on:
      - postgres
    environment:
      - DEV_LOGGING=1
      - DB_INIT=1
      - DB_HOST=postgres
      - DB_PORT=5432
      - DB_USER=test
      - DB_PASSWORD=xxx
      - PGPASSWORD=xxx

#volumes:
#  postgres-data:

我收到此错误{ "timestamp": "2019-06-11T21:08:32.320Z", "level": "ERROR", "thread": "Test worker", "logger": "🐳 [docker/compose:1.8.0]", "message": "Could not start container", "context": "default", "exception": "java.lang.IllegalStateException: Container did not start correctly.\\n\\tat org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:255)\\n\\tat org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:212)\\n\\tat org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:76)\\n\\tat org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:210)\\n\\tat org.testcontainers.containers.GenericContainer.start(GenericContainer.java:199)\\n\\tat org.testcontainers.containers.ContainerisedDockerCompose.invoke(DockerComposeContainer.java:548)\\n\\tat org.testcontainers.containers.DockerComposeContainer.runWithCompose(DockerComposeContainer.java:211)\\n\\tat org.testcontainers.containers.DockerComposeContainer.createServices(DockerComposeContainer.java:165)\\n\\tat org.testcontainers.containers.DockerComposeContainer.start(DockerComposeContainer.java:152)\\n\\tat org.testcontainers.containers.DockerComposeContainer.starting(DockerComposeContainer.java:121)\\n\\tat org.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:29)\\n\\tat org.junit.rules.RunRules.evaluate(RunRules.java:20)\\n\\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\\n\\tat org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)\\n\\tat org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)\\n\\tat org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:498)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)\\n\\tat org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)\\n\\tat org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)\\n\\tat com.sun.proxy.$Proxy2.processTestClass(Unknown Source)\\n\\tat org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:498)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)\\n\\tat org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)\\n\\tat org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)\\n\\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\\n\\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\\n\\tat org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)\\n\\tat java.lang.Thread.run(Thread.java:748)\\n" } { "timestamp": "2019-06-11T21:08:32.348Z", "level": "ERROR", "thread": "Test worker", "logger": "🐳 [docker/compose:1.8.0]", "message": "Log output from the failed container:\\nCreating network \\"k66igshwvupa_default\\" with the default driver\\n\\nCreating consul\\n\\nCreating vault\\n\\nCreating registrator\\n\\nCreating postgres\\n\\n\\n\\nERROR: for postgres Cannot start service postgres: oci runtime error: container_linux.go:247: starting container process caused \\"process_linux.go:359: container init caused \\\\\\"rootfs_linux.go:54: mounting \\\\\\\\\\\\\\"/config/postgres/docker-entrypoint.sh\\\\\\\\\\\\\\" to rootfs \\\\\\\\\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/df4d5e2dae646eab8079cee1b8a562c1b7d2d374340d01fecf4894e6ba64be8e\\\\\\\\\\\\\\" at \\\\\\\\\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/df4d5e2dae646eab8079cee1b8a562c1b7d2d374340d01fecf4894e6ba64be8e/usr/local/bin/docker-entrypoint.sh\\\\\\\\\\\\\\" caused \\\\\\\\\\\\\\"not a directory\\\\\\\\\\\\\\"\\\\\\"\\"\\n\\n: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type\\n\\nEncountered errors while bringing up the project.\\n", "context": "default" } { "timestamp": "2019-06-11T21:08:32.320Z", "level": "ERROR", "thread": "Test worker", "logger": "🐳 [docker/compose:1.8.0]", "message": "Could not start container", "context": "default", "exception": "java.lang.IllegalStateException: Container did not start correctly.\\n\\tat org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:255)\\n\\tat org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:212)\\n\\tat org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:76)\\n\\tat org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:210)\\n\\tat org.testcontainers.containers.GenericContainer.start(GenericContainer.java:199)\\n\\tat org.testcontainers.containers.ContainerisedDockerCompose.invoke(DockerComposeContainer.java:548)\\n\\tat org.testcontainers.containers.DockerComposeContainer.runWithCompose(DockerComposeContainer.java:211)\\n\\tat org.testcontainers.containers.DockerComposeContainer.createServices(DockerComposeContainer.java:165)\\n\\tat org.testcontainers.containers.DockerComposeContainer.start(DockerComposeContainer.java:152)\\n\\tat org.testcontainers.containers.DockerComposeContainer.starting(DockerComposeContainer.java:121)\\n\\tat org.testcontainers.containers.FailureDetectingExternalResource$1.evaluate(FailureDetectingExternalResource.java:29)\\n\\tat org.junit.rules.RunRules.evaluate(RunRules.java:20)\\n\\tat org.junit.runners.ParentRunner.run(ParentRunner.java:363)\\n\\tat org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:106)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)\\n\\tat org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)\\n\\tat org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)\\n\\tat org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:498)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)\\n\\tat org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)\\n\\tat org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)\\n\\tat com.sun.proxy.$Proxy2.processTestClass(Unknown Source)\\n\\tat org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:498)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)\\n\\tat org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)\\n\\tat org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)\\n\\tat org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)\\n\\tat org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)\\n\\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\\n\\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\\n\\tat org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)\\n\\tat java.lang.Thread.run(Thread.java:748)\\n" } { "timestamp": "2019-06-11T21:08:32.348Z", "level": "ERROR", "thread": "Test worker", "logger": "🐳 [docker/compose:1.8.0]", "message": "Log output from the failed container:\\nCreating network \\"k66igshwvupa_default\\" with the default driver\\n\\nCreating consul\\n\\nCreating vault\\n\\nCreating registrator\\n\\nCreating postgres\\n\\n\\n\\nERROR: for postgres Cannot start service postgres: oci runtime error: container_linux.go:247: starting container process caused \\"process_linux.go:359: container init caused \\\\\\"rootfs_linux.go:54: mounting \\\\\\\\\\\\\\"/config/postgres/docker-entrypoint.sh\\\\\\\\\\\\\\" to rootfs \\\\\\\\\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/df4d5e2dae646eab8079cee1b8a562c1b7d2d374340d01fecf4894e6ba64be8e\\\\\\\\\\\\\\" at \\\\\\\\\\\\\\"/mnt/sda1/var/lib/docker/aufs/mnt/df4d5e2dae646eab8079cee1b8a562c1b7d2d374340d01fecf4894e6ba64be8e/usr/local/bin/docker-entrypoint.sh\\\\\\\\\\\\\\" caused \\\\\\\\\\\\\\"not a directory\\\\\\\\\\\\\\"\\\\\\"\\"\\n\\n: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type\\n\\nEncountered errors while bringing up the project.\\n", "context": "default" }

当我给出一条相对路径时它起作用了:

volumes:
  - ./docker-entrypoint.sh:/docker-entrypoint.sh

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM