docker运行错误:无法访问jarfile

Posted

技术标签:

【中文标题】docker运行错误:无法访问jarfile【英文标题】:docker run error: Unable to access jarfile 【发布时间】:2019-06-03 00:48:43 【问题描述】:

Docker 映像已构建,但当我想运行它时,它显示此错误:

Error: Unable to access jarfile rest-service-1.0.jar

我的操作系统是 Ubuntu 18.04.1 LTS,我使用 docker build -t doc-service & docker run doc-service。

这是我的 Dockerfile:

FROM ubuntu:16.04

MAINTAINER Frederico Apostolo <frederico.apostolo@blockfactory.com> (@fapostolo)

RUN apt-get update && apt-get -y upgrade

RUN apt-get install -y software-properties-common python-software-properties language-pack-en-base

RUN add-apt-repository ppa:webupd8team/java

RUN apt-get update && apt-get update --fix-missing && apt-get -y --allow-downgrades --allow-remove-essential --allow-change-held-packages upgrade \
    && echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections \
    && apt-get install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages curl vim unzip wget oracle-java8-installer \
    && apt-get clean && rm -rf /var/cache/* /var/lib/apt/lists/*

ENV JAVA_HOME /usr/lib/jvm/java-8-oracle/

run java -version
run echo $JAVA_HOME

#use locate for debug
RUN apt-get update && apt-get install -y locate mlocate && updatedb

#LIBREOFFICE START
RUN apt-get update && apt-get update --fix-missing && apt-get install -y -q libreoffice \
    libreoffice-writer ure libreoffice-java-common libreoffice-core libreoffice-common \
    fonts-opensymbol hyphen-fr hyphen-de hyphen-en-us hyphen-it hyphen-ru fonts-dejavu \
    fonts-dejavu-core fonts-dejavu-extra fonts-noto fonts-dustin fonts-f500 fonts-fanwood \
    fonts-freefont-ttf fonts-liberation fonts-lmodern fonts-lyx fonts-sil-gentium \
    fonts-texgyre fonts-tlwg-purisa
#LIBREOFFICE END

#font configuration
COPY 00-odt-template-renderer-fontconfig.conf /etc/fonts/conf.d

RUN mkdir /document-service /document-service/fonts /document-service/module /document-service/logs

# local settings
RUN echo "127.0.0.1       http://www.arbs.local http://arbs.local www.arbs.local arbs.local" >> /etc/hosts
# && mkdir /logs/ && echo "dummy" >> /logs/errors.log

#EXPOSE 2115

COPY document-service-java_with_user_arg.sh /
RUN chmod +x /document-service-java_with_user_arg.sh

RUN apt-get update && apt-get -y --no-install-recommends install \
    ca-certificates \
    curl

RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
RUN curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture)" \
    && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.4/gosu-$(dpkg --print-architecture).asc" \
    && gpg --verify /usr/local/bin/gosu.asc \
    && rm /usr/local/bin/gosu.asc \
    && chmod +x /usr/local/bin/gosu

ENV LANG="en_US.UTF-8"

# In case someone loses the Dockerfile
# Needs to be in the end so it doesn't invalidate unaltered cache whenever the file is updated.
RUN rm -rf /etc/Dockerfile
ADD Dockerfile /etc/Dockerfile

ENTRYPOINT ["/document-service-java_with_user_arg.sh"]

this is document-service-java_with_user_arg.sh:

#!/bin/bash

USER_ID=$LOCAL_USER_ID:-9001
USER_NAME=$LOCAL_USER_NAME:-jetty

echo "Starting user: $USER_NAME with UID : $USER_ID"
useradd --shell /bin/bash --home-dir /document-service/dockerhome --non-unique --uid $USER_ID $USER_NAME

cd /document-service

/usr/local/bin/gosu $USER_NAME "$@" java -jar rest-service-1.0.jar

谁能帮我解决这个问题?

【问题讨论】:

看起来缺少 rest-service-1.0.jar。将其添加到您的容器、包和类路径中。 为了调试,你可以运行pwdll/dir来检查命令运行的位置(/usr/local/bin/gosu $USER_NAME "$@" java -jar rest-service-1.0.jar)和给定文件夹的内容,然后你会在最不知道文件是否丢失或无法访问,pwd 会给你位置,它试图找到给定文件的位置 rest-service-1.0.jar 放在 dockerfile 的同一个文件夹下。如何将它添加到我的容器、包和类路径中? 【参考方案1】:

基于 cmets,您必须在构建映像时添加 JAR,方法是在 Dockerfile 中定义:

COPY rest-service-1.0.jar /document-service/rest-service-1.0.jar

你也可以使用:

COPY rest-service-1.0.jar /rest-service-1.0.jar

,并删除入口点脚本中的cd /document-service,如ubuntu:16.04 图像,默认工作目录为/。我认为在脚本中设置工作目录更安全,所以你应该选择第一个解决方案。

请注意,您也可以使用ADD 代替COPY(正如您在Dockerfile 中所做的那样),但这里只有COPY 是必需的(如果您想了解更多信息,请阅读这篇文章:What is the difference between the `COPY` and `ADD` commands in a Dockerfile? )。

最后,我建议您在Dockerfile 末尾添加COPY 行,这样如果构建了新的JAR,图像将不会从头开始重建,而是从现有层重建,从而加快构建速度时间。

【讨论】:

【参考方案2】:

关于工作目录的错误 您必须为此复制格式选择 workdir 试试 WORKDIR /yourpath/

【讨论】:

以上是关于docker运行错误:无法访问jarfile的主要内容,如果未能解决你的问题,请参考以下文章

运行 Docker 映像时无法访问 jarfile

docker-compose java 无法访问 jarfile

我无法在 Ubuntu 中运行 vue cli - 错误:无法访问 jarfile /snap/vue/1/jar/vue-1.0-SNAPSHOT.jar

无法访问 jarfile - Elastic Beanstalk 上的 Docker

Spring/GitHub/Docker - 错误:jarfile 无效或损坏

java运行时出现“Unable to access jarfile adbc.jar”是为啥?