Docker-compose“exec:\”/usr/src/app/entrypoint.sh\“:权限被拒绝”

Ari*_*ong 5 docker-compose alpine-linux

这是基于https://testdriven.io/courses/microservices-with-docker-flask-and-react/

\n\n

我正在运行一个指向entrypoint.sh 的docker 文件。

\n\n

成功docker-compose-f docker-compose-dev.yml build run\n但正在运行docker-compose-f docker-compose-dev.yml up显示

\n\n
ERROR: for users  Cannot start service users: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \\"/usr/src/app/entrypoint.sh\\": permission denied": unknown\nERROR: Encountered errors while bringing up the project.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我确实尝试使用docker run -it \xe2\x80\x93tty users_app:latest sh.\nRunning在交互模式下运行./entrypoint.sh运行确实有效。\n但它不适用于 docker-compose。

\n\n

有人有同样的问题吗?

\n\n

这是我的 docker-compose-dev.yml、Dockerfile-dev 和 entrypoint.sh

\n\n

docker-compose-dev.yml

\n\n
version: \'3.6\'\n\nservices:\n  users:\n    build:\n      context: ./services/users\n      dockerfile: Dockerfile-dev\n    volumes:\n      - \'./services/users:/usr/src/app\'\n    ports:\n      - 5001:5000\n    environment:\n      - FLASK_APP=project/__init__.py\n      - FLASK_ENV=development\n      - APP_SETTINGS=project.config.DevelopmentConfig\n      - DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev\n      - DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test    \n    depends_on:\n      - users-db\n\n  users-db:  \n    build:\n      context: ./services/users/project/db\n      dockerfile: Dockerfile\n    ports:\n      - 5435:5432\n    environment:\n      - POSTGRES_USER=postgres\n      - POSTGRES_PASSWORD=postgres\n
Run Code Online (Sandbox Code Playgroud)\n\n

Dockerfile-dev

\n\n
# base image\nFROM python:3.6.5-alpine\n\n# install dependencies\nRUN apk update && \\\n    apk add --virtual build-deps gcc python-dev musl-dev && \\\n    apk add postgresql-dev && \\\n    apk add netcat-openbsd\n\n# set working directory\nWORKDIR /usr/src/app\n\n# add and install requirements\nCOPY ./requirements.txt /usr/src/app/requirements.txt\nRUN pip install -r requirements.txt\n\n# add app\nCOPY . /usr/src/app\n\n# add entrypoint.sh\nCOPY ./entrypoint.sh /usr/src/app/entrypoint.sh\nRUN chmod +x /usr/src/app/entrypoint.sh\n\n# run server\n#USER root\n#RUN ["chmod", "+x", "/usr/src/app/entrypoint.sh"]\nCMD ["/usr/src/app/entrypoint.sh"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

入口点.sh

\n\n
#!/bin/sh\n\necho "Waiting for postgres..."\nwhile ! nc -z users-db 5432; do\n    sleep 0.1\ndone\n\necho "PostgresSQL started"\n\npython manage.py run -h 0.0.0.0\n
Run Code Online (Sandbox Code Playgroud)\n

Ari*_*ong 12

在源目录中运行chmod +x /usr/src/entrypoint.sh确实有效。
Docker 是它自己的系统文件,但它从源目录复制所有内容(包括权限)。

但是,我无法理解,为什么RUN chmod +x /usr/src/app/entrypoint.sh在 dockerfile 中运行不起作用


小智 7

entrypoint.sh检查主机的权限,因为它会将所有内容复制到容器中。

chmod +x ./entrypoint.sh
Run Code Online (Sandbox Code Playgroud)

然后重建。