代码之家  ›  专栏  ›  技术社区  ›  Ron

docker为sh命令编写“无此类文件或目录”

  •  1
  • Ron  · 技术社区  · 6 年前

    我正在准备 docker-for-windows 在我的私人电脑上。

    当我不久前在我的办公室笔记本电脑上设置它时,我也遇到了同样的问题,但它只是停止了发生。

    所以我不得不这样做:

    我有一个docker工作项目(在我的另一台计算机上),有一个 docker-compose.yml 这样地:

    version: '2'
    
    services:
      web:
        depends_on:
          - db
        build: .
        env_file: ./docker-compose.env
        command: bash ./run_web_local.sh
        volumes:
          - .:/srv/project
        ports:
          - 8001:8001
        links:
          - db
          - rabbit
        restart: always
    

    Dockerfile:

    ### STAGE 1: Build ###
    
    # We label our stage as 'builder'
    FROM node:8-alpine as builder
    
    RUN npm set progress=false && npm config set depth 0 && npm cache clean --force
    
    # build backend
    ADD package.json /tmp/package.json
    ADD package-lock.json /tmp/package-lock.json
    RUN cd /tmp && npm install
    RUN mkdir -p /backend-app && cp -a /tmp/node_modules /backend-app
    
    ### STAGE 2: Setup ###
    FROM python:3
    
    # Install Python dependencies
    COPY requirements.txt /tmp/requirements.txt
    RUN pip3 install -U pip
    RUN pip3 install --no-cache-dir -r /tmp/requirements.txt
    
    # Set env variables used in this Dockerfile (add a unique prefix, such as DOCKYARD)
    # Local directory with project source
    ENV PROJECT_SRC=.
    # Directory in container for all project files
    ENV PROJECT_SRVHOME=/srv
    # Directory in container for project source files
    ENV PROJECT_SRVPROJ=/srv/project
    
    # Create application subdirectories
    WORKDIR $PROJECT_SRVPROJ
    RUN mkdir media static staticfiles logs
    
    # make folders available for other containers
    VOLUME ["$PROJECT_SRVHOME/media/", "$PROJECT_SRVHOME/logs/"]
    
    # Copy application source code to SRCDIR
    COPY $PROJECT_SRC $PROJECT_SRVPROJ
    
    COPY --from=builder /backend-app/node_modules $PROJECT_SRVPROJ/node_modules
    
    # Copy entrypoint script into the image
    WORKDIR $PROJECT_SRVPROJ
    
    # EXPOSE port 8000 to allow communication to/from server
    EXPOSE 8000
    
    CMD ["./run_web.sh"]
    

    docker撰写。环境:

    C_FORCE_ROOT=True
    DJANGO_CELERY_BROKER_URL=amqp://admin:mypass@rabbit:5672//
    DJANGO_DATABASE_ENGINE=django.db.backends.mysql
    DJANGO_DATABASE_NAME=project-db
    DJANGO_DATABASE_USER=project-user
    DJANGO_DATABASE_PASSWORD=mypassword
    DJANGO_DATABASE_HOST=db
    DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost
    DJANGO_DEBUG=True
    DJANGO_USE_DEBUG_TOOLBAR=off
    DJANGO_TEST_RUN=off
    PYTHONUNBUFFERED=0
    

    在本地运行网络。上海:

    #!/bin/bash
    echo django shell commands
    python ./manage.py migrate
    echo Starting django server on 127.0.0.1:8000
    python ./manage.py runserver 127.0.0.1:8000
    

    当我打电话的时候 docker-compose up web 我得到以下错误:

    web|1 | bash:/在本地运行网络。sh:没有这样的文件或目录

    • 我检查了行尾,它们是UNIX
    • 该文件既存在于文件系统中,也存在于容器中
    • 我可以打电话 bash run_web_local.sh 从我的windows powershell和容器内部
    • 我更改了容器中的UNIX权限
    • 我漏掉了 bash command docker-compose 命令并尝试使用反斜杠、无点等。
    • 我重新安装了docker
    • 我试着切换到第三版
    • docker声称与我的共享驱动器C有连接

    和:完全相同的设置 作品 在我的另一台笔记本电脑上。

    有什么想法吗?所有的两百万github帖子并没有为我解决这个问题。

    谢谢

    使现代化

    移除 volumes: 从码头工人的角度来说,作曲可以让它发挥作用 like stated here 但我没有即时映射。这对我来说很重要。。。

    3 回复  |  直到 6 年前
        1
  •  4
  •   Wolfium    5 年前

    我最近也遇到了同样的问题,使用任何高级编辑器,并在sh entrypoint脚本上将行结尾更改为unix风格,这些问题都会消失。

    在我的例子中,我不知道为什么,因为git可以很好地处理它,这取决于linux或windows主机,我最终也遇到了同样的情况。 如果您在容器和主机(在windows中)中安装了文件 它取决于您编辑它们的方式,可能会从容器内部更改为linux,但这会影响windows主机外部。 在git声明文件之后。sh已更改,但没有添加或删除。 一个图形化的比较工具显示,只有新行发生了变化。

    另一个解决问题的方法是,您可以启动容器覆盖入口点脚本(例如sh),然后在启动的容器上检查linux如何查看入口点脚本,即使您可以测试它,也会看到完全相同的错误

    对不起,我的英语不是我的母语。 希望这对别人有帮助。

        2
  •  3
  •   harmider    4 年前

    在克隆存储库之前,应发出以下命令:

    git config --global core.autocrlf false
    

    这会将行尾更改为UNIX样式。

    然后克隆存储库并继续。

        3
  •  1
  •   Riccardo Degan    6 年前

    这可能是因为bash文件不在workdir的根路径或根路径中。 检查它在容器中的位置,并验证路径是否正确。

        4
  •  1
  •   Ron    6 年前

    如果可能的话,请你提供与此相关的所有文件,以便我可以尝试重现这个问题。

    似乎命令未执行的是运行_web _local的目录。不存在。

    您可以通过替换docker compose中的命令来检查当前workdir。yml as command: pwd && bash ./run_web_local.sh

        5
  •  1
  •   Adeptus Mechanicus    5 年前

    我在Ubuntu18.04.3中注意到的一点是,你需要在docker上安装docker compose。io让docker继续工作

    • sudo安装docker。木卫一
    • sudo apt安装docker compose

    在我这么做之后,我让docker compose[filename.yml]毫无问题地开始工作

        6
  •  0
  •   Ashok    3 年前

    不要在结尾使用-d。 而不是这个命令 docker compose-f start_工具。亚马尔 使用 docker compose-f start_工具。扬起