exit code 127 and ': No such file or directory`
start.sh
clearly contains DOS newlines. Add a new command:
RUN dos2unix /opt/start.sh
...after the COPY
.
To make this easier to diagnose, you can make your shell use xtrace
logging. To quote a comment on the question:
Comment out the
ENTRYPOINT
and change theCMD
toCMD ["/bin/bash", "-x", "/opt/start.sh", "run"]
. Logs will be on stderr.
CodeMed
Updated on June 06, 2022Comments
-
CodeMed almost 2 years
The container `` below is exiting with code 127 and the message
': No such file or directory
.What specific changes need to be made in order for this error to resolve so that the container can run successfully?
docker inspect
The following are the results of
docker ps -a -q
, followed bydocker inspect 1d86d855a3d1
C:\projects\docker\crowd\atlassian-crowd-docker>docker ps -a -q 1d86d855a3d1 C:\projects\docker\crowd\atlassian-crowd-docker>docker inspect 1d86d855a3d1 [ { "Id": "1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b", "Created": "2018-07-25T23:30:58.584251386Z", "Path": "/opt/start.sh", "Args": [ "run" ], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 127, "Error": "", "StartedAt": "2018-07-25T23:37:02.200147887Z", "FinishedAt": "2018-07-25T23:37:02.192281696Z" }, "Image": "sha256:0176cf7cd57ac2b73eb4a0fc4fb907fcd6ab772a5c5e9b9ce3e45a32e8d66d1d", "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b/resolv.conf", "HostnamePath": "/mnt/sda1/var/lib/docker/containers/1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b/hostname", "HostsPath": "/mnt/sda1/var/lib/docker/containers/1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b/hosts", "LogPath": "/mnt/sda1/var/lib/docker/containers/1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b/1d86d855a3d13d7b9e695cce9490b6f4700c61027287f7383110cf6937d81b3b-json.log", "Name": "/practical_kalam", "RestartCount": 0, "Driver": "aufs", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": { "8443/tcp": [ { "HostIp": "", "HostPort": "8443" } ] }, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "shareable", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 26, 107 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Data": null, "Name": "aufs" }, "Mounts": [], "Config": { "Hostname": "1d86d855a3d1", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "ExposedPorts": { "8080/tcp": {}, "8443/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin", "LANG=C.UTF-8", "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre", "JAVA_VERSION=8u151", "JAVA_ALPINE_VERSION=8.151.12-r0", "CATALINA_HOME=/usr/local/tomcat", "TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib", "LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib", "GPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23", "TOMCAT_MAJOR=9", "TOMCAT_VERSION=9.0.2", "TOMCAT_SHA1=b59e1d658a4edbca7a81d12fd6f20203a4da9743", "TOMCAT_TGZ_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz", "TOMCAT_ASC_URLS=https://www.apache.org/dyn/closer.cgi?action=download&filename=tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz.asc \thttps://www-us.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz.asc \thttps://www.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz.asc \thttps://archive.apache.org/dist/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz.asc", "CROWD_HOME=/opt/crowd/home", "CROWD_INSTALL=/opt/crowd/webapp", "CROWD_USER=crowd", "CROWD_GROUP=crowd", "CROWD_VERSION=2.12.0", "MYSQL_CONNECTOR_VERSION=5.1.39" ], "Cmd": [ "run" ], "ArgsEscaped": true, "Image": "debian-crowd", "Volumes": null, "WorkingDir": "/usr/local/tomcat", "Entrypoint": [ "/opt/start.sh" ], "OnBuild": null, "Labels": { "org.label-schema.vcs-url": "https://github.com/Dwolla/atlassian-crowd-docker" } }, "NetworkSettings": { "Bridge": "", "SandboxID": "7044cebfde1cd851bae7cc5a5034b4af87318ed89062074bf7236e168c422a6a", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/7044cebfde1c", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "", "Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "MacAddress": "", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "bcec3d0b3e8a17638d85d6419deadd4bdd4150659d60358ebb1737e1ac306710", "EndpointID": "", "Gateway": "", "IPAddress": "", "IPPrefixLen": 0, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "", "DriverOpts": null } } } } ]
docker logs
C:\projects\docker\crowd\atlassian-crowd-docker>docker logs 1d86d855a3d1 ': No such file or directory ': No such file or directory
Dockerfile
Dockerfile looks like:
FROM tomcat:9.0-alpine MAINTAINER Dwolla Engineering <[email protected]> LABEL org.label-schema.vcs-url="https://github.com/Dwolla/atlassian-crowd-docker" ENV CROWD_HOME=/opt/crowd/home \ CROWD_INSTALL=/opt/crowd/webapp \ CROWD_USER=crowd \ CROWD_GROUP=crowd \ CROWD_VERSION=2.12.0 \ MYSQL_CONNECTOR_VERSION=5.1.39 EXPOSE 8443 COPY redirector /opt/redirector RUN apk update && \ apk add --update curl ca-certificates jq groff less python py-pip bash openssl openjdk8 && \ curl https://www.digicert.com/CACerts/GTECyberTrustGlobalRoot.crt | openssl x509 -inform der -outform pem -out /usr/local/share/ca-certificates/GTECyberTrustGlobalRoot.crt && \ update-ca-certificates && \ rm -rf ${CATALINA_HOME}/webapps/* && \ mkdir -p ${CROWD_HOME} ${CROWD_INSTALL} ${CATALINA_HOME}/conf/Catalina/localhost && \ cd /opt && \ curl -vL -o ${CROWD_INSTALL}/crowd.war https://www.atlassian.com/software/crowd/downloads/binary/atlassian-crowd-${CROWD_VERSION}-war.zip && \ cd ${CROWD_INSTALL} && unzip -n crowd.war && rm crowd.war && cd - && \ curl -vL -o /tmp/mysql-connector.tgz https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-${MYSQL_CONNECTOR_VERSION}.tar.gz && \ tar xzf /tmp/mysql-connector.tgz mysql-connector-java-${MYSQL_CONNECTOR_VERSION}/mysql-connector-java-${MYSQL_CONNECTOR_VERSION}-bin.jar && \ mv mysql-connector-java-5.1.39/mysql-connector-java-${MYSQL_CONNECTOR_VERSION}-bin.jar ${CATALINA_HOME}/lib/mysql-connector-java-${MYSQL_CONNECTOR_VERSION}-bin.jar && \ pip install --upgrade pip && \ pip install awscli && \ sed -i s_securerandom.source=file:/dev/random_securerandom.source=file:/dev/urandom_ $JAVA_HOME/lib/security/java.security && \ curl -vL "https://dl.bintray.com/sbt/native-packages/sbt/0.13.15/sbt-0.13.15.tgz" | \ gunzip | tar -x -C /usr/local && \ cd /opt/redirector && \ /usr/local/sbt/bin/sbt clean test package && \ mkdir -p ${CATALINA_HOME}/webapps/ROOT && unzip -d ${CATALINA_HOME}/webapps/ROOT target/scala-2.11/*.war && \ apk --purge -v del py-pip openjdk8 && \ rm -rf /var/cache/apk/* /opt/redirector /usr/local/sbt /tmp/* /root/.ivy2/ /root/.sbt/ /root/.cache/ && \ ls -al /usr/lib/jvm/java-1.8-openjdk/jre COPY context.xml.tmpl /opt/context.xml.tmpl COPY server.xml ${CATALINA_HOME}/conf/server.xml COPY crowd.cfg.tmpl /opt/crowd.cfg.tmpl COPY start.sh /opt/start.sh COPY jars/* ${CATALINA_HOME}/lib/ ENTRYPOINT ["/opt/start.sh"] CMD ["run"]
start.sh
start.sh
looks like:#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' aws s3 cp ${DATABASE_CONFIG_OBJECT} ${CROWD_HOME}/crowduser.json aws s3 cp ${CROWD_CONFIG_OBJECT} ${CROWD_HOME}/config.json if aws s3 ls ${CROWD_SECRETS_OBJECT} > /dev/null; then aws s3 cp ${CROWD_SECRETS_OBJECT} ${CROWD_HOME}/config_secrets.json else cat <<__CONFIG_SECRETS_END__ > ${CROWD_HOME}/config_secrets.json { "application_password": "" } __CONFIG_SECRETS_END__ fi # Set up JNDI resources in Tomcat root context tmpl=$(cat /opt/context.xml.tmpl | sed 's_"_\\"_g') printf "\"%s\"" "$tmpl" | jq -r -f /dev/stdin ${CROWD_HOME}/crowduser.json > ${CATALINA_HOME}/conf/Catalina/localhost/crowd.xml tmpl=$(cat /opt/crowd.cfg.tmpl | sed 's_"_\\"_g') printf "\"%s\"" "$tmpl" | jq -r -f /dev/stdin ${CROWD_HOME}/config.json > ${CROWD_HOME}/crowd.cfg.xml cat <<__PROPERTIES_END__ | xargs -0 printf "\"%s\"" | jq -r -f /dev/stdin ${CROWD_HOME}/config_secrets.json > ${CROWD_HOME}/crowd.properties session.lastvalidation=session.lastvalidation session.tokenkey=session.tokenkey crowd.server.url=https\\\://localhost:8443/crowd/services/ application.login.url=https\\\://${CROWD_SERVER_URL}/crowd crowd.base.url=https\\\://${CROWD_SERVER_URL}/crowd/ application.name=crowd http.timeout=30000 session.isauthenticated=session.isauthenticated session.validationinterval=0 application.password=\(.application_password) __PROPERTIES_END__ cat <<__CROWD_INIT_END__ > ${CROWD_INSTALL}/WEB-INF/classes/crowd-init.properties crowd.home=${CROWD_HOME} __CROWD_INIT_END__ openssl req -x509 \ -newkey rsa:4096 \ -keyout ${CATALINA_HOME}/conf/localhost-rsa-key.pem \ -out ${CATALINA_HOME}/conf/localhost-rsa-cert.pem \ -days 365 \ -nodes \ -subj "${CROWD_TLS_SUBJ}" keytool -import \ -alias crowd \ -file $CATALINA_HOME/conf/localhost-rsa-cert.pem \ -keystore $JAVA_HOME/lib/security/cacerts \ -storepass changeit \ -noprompt exec ${CATALINA_HOME}/bin/catalina.sh $@
CharlesDuffy's suggestions
The result of making @CharlesDuffy's suggested change to print errors to stderr looks like:
C:\projects\docker\crowd\atlassian-crowd-docker>docker run -p 8443:8443 mycrowd + PS4=':$BASH_SOURCE:$LINENO+' :/opt/start.sh:2+set -x :/opt/start.sh:2+$':\r' /opt/start.sh: line 2: $':\r': command not found :/opt/start.sh:3+set -euo $'pipefail\r' : invalid option name: set: pipefail
And then the next iteration resulted in:
C:\projects\docker\crowd\atlassian-crowd-docker>docker run -p 8443:8443 mycrowd + PS4=':$BASH_SOURCE:$LINENO+' :/opt/start.sh:2+set -x :/opt/start.sh:2+: :/opt/start.sh:3+set -euo pipefail :/opt/start.sh:4+IFS=' ' /opt/start.sh: line 6: DATABASE_CONFIG_OBJECT: unbound variable