Docker-撰写 "exec: \"/usr/src/app/entrypoint.sh\": 权限被拒绝"
Docker-compose "exec: \"/usr/src/app/entrypoint.sh\": permission denied"
这是基于https://testdriven.io/courses/microservices-with-docker-flask-and-react/
我正在运行创建一个指向entrypoint.sh 的docker 文件。
docker-compose-f docker-compose-dev.yml build run
成功
但是 运行ning docker-compose-f docker-compose-dev.yml up
显示
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
ERROR: Encountered errors while bringing up the project.
我确实尝试过 运行 与 docker run -it –tty users_app:latest sh
的交互模式。
运行 ./entrypoint.sh
成功了。
但它不适用于 docker-compose。
有人遇到同样的问题吗?
这是我的 docker-compose-dev.yml、Dockerfile-dev 和 entrypoint.sh
docker-撰写-dev.yml
version: '3.6'
services:
users:
build:
context: ./services/users
dockerfile: Dockerfile-dev
volumes:
- './services/users:/usr/src/app'
ports:
- 5001:5000
environment:
- FLASK_APP=project/__init__.py
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
depends_on:
- users-db
users-db:
build:
context: ./services/users/project/db
dockerfile: Dockerfile
ports:
- 5435:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
Dockerfile-dev
# base image
FROM python:3.6.5-alpine
# install dependencies
RUN apk update && \
apk add --virtual build-deps gcc python-dev musl-dev && \
apk add postgresql-dev && \
apk add netcat-openbsd
# set working directory
WORKDIR /usr/src/app
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# add app
COPY . /usr/src/app
# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# run server
#USER root
#RUN ["chmod", "+x", "/usr/src/app/entrypoint.sh"]
CMD ["/usr/src/app/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
echo "Waiting for postgres..."
while ! nc -z users-db 5432; do
sleep 0.1
done
echo "PostgresSQL started"
python manage.py run -h 0.0.0.0
运行 源目录中的 chmod +x /usr/src/entrypoint.sh
确实有效。
Docker 是它自己的系统文件,但它从源目录复制所有内容(包括权限)。
但是,我无法理解,为什么 运行 dockerfile 中的 RUN chmod +x /usr/src/app/entrypoint.sh
不起作用
检查主机中 entrypoint.sh
的权限,因为它会将所有内容复制到容器中。
chmod +x ./entrypoint.sh
然后重建。
如果您在 windows 框上开发,则可能是行终止符问题。当 bash 运行您的脚本时,它不会处理 windows 样式的 /r/n 行终止符。
在您的 windows 开发箱上本地尝试 运行 这个...
dos2unix entrypoint.sh
这会将行终止符更改为 unix 样式。然后重建容器。这为我解决了问题。
这是基于https://testdriven.io/courses/microservices-with-docker-flask-and-react/
我正在运行创建一个指向entrypoint.sh 的docker 文件。
docker-compose-f docker-compose-dev.yml build run
成功
但是 运行ning docker-compose-f docker-compose-dev.yml up
显示
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
ERROR: Encountered errors while bringing up the project.
我确实尝试过 运行 与 docker run -it –tty users_app:latest sh
的交互模式。
运行 ./entrypoint.sh
成功了。
但它不适用于 docker-compose。
有人遇到同样的问题吗?
这是我的 docker-compose-dev.yml、Dockerfile-dev 和 entrypoint.sh
docker-撰写-dev.yml
version: '3.6'
services:
users:
build:
context: ./services/users
dockerfile: Dockerfile-dev
volumes:
- './services/users:/usr/src/app'
ports:
- 5001:5000
environment:
- FLASK_APP=project/__init__.py
- FLASK_ENV=development
- APP_SETTINGS=project.config.DevelopmentConfig
- DATABASE_URL=postgres://postgres:postgres@users-db:5432/users_dev
- DATABASE_TEST_URL=postgres://postgres:postgres@users-db:5432/users_test
depends_on:
- users-db
users-db:
build:
context: ./services/users/project/db
dockerfile: Dockerfile
ports:
- 5435:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
Dockerfile-dev
# base image
FROM python:3.6.5-alpine
# install dependencies
RUN apk update && \
apk add --virtual build-deps gcc python-dev musl-dev && \
apk add postgresql-dev && \
apk add netcat-openbsd
# set working directory
WORKDIR /usr/src/app
# add and install requirements
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
# add app
COPY . /usr/src/app
# add entrypoint.sh
COPY ./entrypoint.sh /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh
# run server
#USER root
#RUN ["chmod", "+x", "/usr/src/app/entrypoint.sh"]
CMD ["/usr/src/app/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
echo "Waiting for postgres..."
while ! nc -z users-db 5432; do
sleep 0.1
done
echo "PostgresSQL started"
python manage.py run -h 0.0.0.0
运行 源目录中的 chmod +x /usr/src/entrypoint.sh
确实有效。
Docker 是它自己的系统文件,但它从源目录复制所有内容(包括权限)。
但是,我无法理解,为什么 运行 dockerfile 中的 RUN chmod +x /usr/src/app/entrypoint.sh
不起作用
检查主机中 entrypoint.sh
的权限,因为它会将所有内容复制到容器中。
chmod +x ./entrypoint.sh
然后重建。
如果您在 windows 框上开发,则可能是行终止符问题。当 bash 运行您的脚本时,它不会处理 windows 样式的 /r/n 行终止符。
在您的 windows 开发箱上本地尝试 运行 这个...
dos2unix entrypoint.sh
这会将行终止符更改为 unix 样式。然后重建容器。这为我解决了问题。