【问题标题】:run java in docker-compose在 docker-compose 中运行 java
【发布时间】:2018-04-12 15:37:51
【问题描述】:

这是我的 docker-compose file.yaml:

version: '3.3'

services:
  db:
    container_name: dbContainer
    image: mysql:5.7
    volumes:
    - /home/crismon-01/Documenti/TESI/Docker/mysqlLogin/datas:/var/lib/mysql
    ports:
    - 3306
    environment:
     MYSQL_ROOT_PASSWORD: "root"
     MYSQL_USER: "root"
     MYSQL_PASSWORD: "root"
     MYSQL_DATABASE: "schema1"
  java:
    container_name: loginJava
    image: openjdk:7
    depends_on:
    - db
    volumes:
    - ./home/crismon-01/Documenti/TESI/Docker/mysqlLogin:/usr/src/myapp 
    working_dir: /usr/src/myapp
    command: bash -c "java -jar LogiIn.jar"

它是一个包含两个 cotnainer 一个与 mysql 和一个与使用 db 的 javacode 的组合,现在我需要运行它,我有这个错误:

crismon-01@crismon01-XPS15:~/Documenti/TESI/Docker/mysqlLogin$ docker-compose up
Starting dbContainer ... done
Starting mysqllogin_java_1 ... done
Attaching to dbContainer, mysqllogin_java_1
dbContainer | Initializing database
dbContainer | 2018-04-12T15:35:07.134004Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
dbContainer | 2018-04-12T15:35:07.135231Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
dbContainer | 2018-04-12T15:35:07.135247Z 0 [ERROR] Aborting
dbContainer | 
java_1  | Error: Unable to access jarfile LogiIn.jar
dbContainer exited with code 1
mysqllogin_java_1 exited with code 1

有人知道错误的根源吗?

【问题讨论】:

    标签: java mysql sql docker docker-compose


    【解决方案1】:

    问题是您在 java 服务的 compose 部分中指定了 command 部分。似乎只拍了,也就是最后一张。

    解决方案是将两个命令组合成一个命令

    java:
      image: openjdk:7
      depends_on:
      - db
      volumes:
      - /home/crismon-01/Documenti/TESI/Docker/mysqlLogin:/usr/src/myapp 
      command: bash -c "cd /usr/src/myapp && java -jar LogiIn.jar"
    

    查看Using Docker-Compose, how to execute multiple commands 了解更多信息。

    或者,您只能设置working_dir 属性并删除cd 命令。

      volumes:
      - /home/crismon-01/Documenti/TESI/Docker/mysqlLogin:/usr/src/myapp 
      working_dir: /usr/src/myapp
      command: java -jar LogiIn.jar
    

    【讨论】:

    • 它说:启动容器进程导致“exec:\”cd\”:在 $PATH 中找不到可执行文件”:就像在容器文件系统中看不到文件夹
    • @CristianMonti 更新了答案。尝试使用 bash 包装命令:bash -c "cd /usr/src/myapp && java -jar LogiIn.jar"。或者使用working_dir 属性。
    • 我有这个,可能是分贝?启动 dbContainer ... 完成 重新创建 mysqllogin_java_1 ... 完成 附加到 dbContainer,mysqllogin_java_1 。请使用 --explicit_defaults_for_timestamp 服务器选项(有关详细信息,请参阅文档)。数据库容器 | 2018-04-12T15:53:25.475417Z 0 [错误] -- 指定了初始化,但数据目录中有文件。中止。数据库容器 | 2018-04-12T15:53:25.475433Z 0 [错误] 中止 dbContainer | dbContainer 以代码 1 退出 mysqllogin_java_1 以代码 1 退出
    • > --initialize 已指定,但数据目录中有文件。 db 抱怨数据目录不为空。这是由于卷 '/var/lib/mysql' 已经存在。尝试清理文件夹:/home/crismon-01/Documenti/TESI/Docker/mysqlLogin 然后重试
    • 是的,现在它做了更多的事情,但它关闭了所有:dbContainer | 2018-04-12T16:06:57.332074Z 0 [警告] InnoDB:创建新日志文件,LSN=45790 java_1 |错误:无法访问 jarfile LogiIn.jar mysqllogin_java_1 exited with code 1 ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%' 这是我在 shell 的堆栈跟踪中看到的错误
    【解决方案2】:

    Testcontainers 库支持 Docker Compose

    引用官方文档

    指向 docker-compose.yml 文件的单个类规则应该足以启动测试所需的任意数量的服务:

     @ClassRule public static DockerComposeContainer environment =
         new DockerComposeContainer(new File("src/test/resources/compose-test.yml"))
                 .withExposedService("redis_1", REDIS_PORT)
                 .withExposedService("elasticsearch_1", ELASTICSEARCH_PORT); 
    

    在这个例子中,compose-test.yml 应该有 内容如:

    redis:   image: redis elasticsearch:   image: elasticsearch
    

    更多详情见官方文档 https://www.testcontainers.org/modules/docker_compose/

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 2019-02-15
      相关资源
      最近更新 更多