docker-为sh-command撰写“无此类文件或目录”

时间:2018-06-30 09:17:29

标签: docker docker-compose docker-windows

我正在我的私人PC上设置docker-for-windows

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

所以我对此保持执着:

我(在另一台计算机上)有一个docker-working项目,其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-compose.env:

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

run_web_local.sh:

#!/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:./run_web_local.sh:没有这样的文件或目录

  • 我检查了行尾,它们是UNIX
  • 文件存在于文件系统以及容器内部
  • 我可以从Windows PowerShell和容器内部调用bash run_web_local.sh
  • 我更改了容器内的UNIX权限
  • 我在bash命令的command中遗漏了docker-compose。并尝试使用反斜杠,无点等。
  • 我重新安装了docker
  • 我尝试过切换到版本3
  • docker声称与我的共享驱动器C有连接

并且:完全相同的设置在我的另一台笔记本电脑上可以运行

有什么想法吗?所有200万个github帖子都没有为我解决问题。

谢谢!

更新

从docker-compose中删除volumes:使其工作like stated here,但我没有即时映射。这对我来说很重要...

5 个答案:

答案 0 :(得分:1)

最近我遇到了同样的问题,使用任何高级编辑器并在sh入口点脚本上将行尾更改为unix样式后,问题都消失了。

在我的情况下,不确定为什么,因为git在Linux或Windows主机上处理得很好,所以我遇到了同样的情况。 如果文件已安装在容器和主机中(在Windows中) 这取决于您如何编辑它们,它们可能会从容器内部更改为linux,但这会影响外部Windows主机。 在那个git声明的文件.sh更改之后,没有添加,也没有删除。 图形比较工具显示只有新行发生了更改。

另一个解决问题的方法是,例如,可以通过sh启动容器覆盖的入口点脚本,然后从那里检查启动的容器,Linux如何看待入口点脚本,甚至可以对其进行测试并看到完全相同的错误< / p>

抱歉,我的英语不是我的母语。 希望这对某人有帮助。

答案 1 :(得分:1)

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

git config --global core.autocrlf false

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

然后克隆存储库并继续。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

请尽可能提供与此相关的所有文件,以便我可以尝试重现此问题。

好像命令没有执行是run_web_local.sh所在的目录。

您可以通过将docker-compose.yml中的命令替换为来检查当前工作目录 command: pwd && bash ./run_web_local.sh

答案 4 :(得分:0)

我在Ubuntu 18.04.3中注意到的一件事情是,您需要在docker.io上安装docker-compose才能使docker-compose正常工作

  • sudo apt安装docker.io
  • sudo apt安装docker-compose

这样做之后,我就可以将docker-compose [filename.yml]正常工作了