2

I have a Java application that runs in docker based on the cutdown alpine distribution, I want umask to be set to 0000 so that all files created by the application in the configured volume /music are accessible to all users.

The last thing the Dockerfile does is run a script that starts the application

CMD /opt/songkong/songkongremote.sh

This file contains the following

   umask 0000
   java -XX:MaxRAMPercentage=60 \  
        -Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog\  
       -Dorg.jboss.logging.provider=jdk \       
-Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLogging\             --add-opens java.base/java.lang=ALL-UNNAMED -jar lib/songkong-6.9.jar -r

The application runs, but in the docker container logs I see the following is output to stdout

/opt/songkong/songkongremote.sh: umask: line 1: illegal mode: 0000

indicating the umask command did not work, which I do not understand since that is a valid value for umask. (I have also tried umask 000 at that failed with same error)

I also tried adding

#!/bin/sh

as the first line to the file, but then Docker complained it could not find /bin/sh.

Full Dockerfile is:

FROM adoptopenjdk/openjdk11:alpine-jre

RUN apk --no-cache add \
      ca-certificates \
      curl \
      fontconfig \
      msttcorefonts-installer \
      tini \
 && update-ms-fonts \
 && fc-cache -f

RUN mkdir -p /opt \
 && curl http://www.jthink.net/songkong/downloads/build1114/songkong-linux-docker.tgz?val=121| tar -C /opt -xzf - \
&& find /opt/songkong -perm /u+x -type f -print0 | xargs -0 chmod a+x

EXPOSE 4567

ENTRYPOINT ["/sbin/tini"]

# Config, License, Logs, Reports and Internal Database
VOLUME /songkong

# Music folder should be mounted here
VOLUME /music

WORKDIR /opt/songkong

CMD /opt/songkong/songkongremote.sh
Paul Taylor
  • 12,050
  • 34
  • 149
  • 295

2 Answers2

2

Your /opt/songkong/songkongremote.sh script has what looks like non-linux newlines (Windows?).

enter image description here

You can view it by running:

$ docker run --rm -it your-image-name vi /opt/songkong/songkongremote.sh

And it is the same reason the #!/bin/sh line did not work, it probably looked like #!/bin/sh^M as well.

DannyB
  • 5,900
  • 1
  • 24
  • 31
  • Thanks, that was indeed it. Ive fallen foul of this before, by dev env is windows using Jebrains Intellij Ide and it doesnt give me any indictation when it does this, must be some setting I need to use. – Paul Taylor Apr 16 '20 at 16:09
1

You have carriage return characters in your script file:

umask 0000^M
java -XX:MaxRAMPercentage=60 -Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog -Dorg.jboss.logging.provider=jdk -Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLoggi
^M

You can add RUN sed -i -e 's/\r//g' /opt/songkong/songkongremote.sh to the Dockerfile or better recreate the script.

Andrew
  • 81
  • 2