在 Docker 上构建 Hub 在复制文件时忽略上下文路径
Building on Docker Hub ignores context path when copying files
我正在尝试将 Django 应用程序上传到 Docker Hub。在本地计算机 (Ubuntu 18.04) 上一切正常,但在 Docker Hub 上存在无法找到 requirements.txt 文件的问题。
本地机器:
sudo docker-compose build --no-cache
结果(还可以):
Step 5/7 : COPY . .
---> 5542d55caeae
Step 6/7 : RUN file="$(ls -1 )" && echo $file
---> Running in b85a55aa2640
Dockerfile db.sqlite3 hello_django manage.py requirements.txt venv
Removing intermediate container b85a55aa2640
---> 532e91546d41
Step 7/7 : RUN pip install -r requirements.txt
---> Running in e940ebf96023
Collecting Django==3.2.2....
但是,Docker 中心:
Step 5/7 : COPY . .
---> 852fa937cb0a
Step 6/7 : RUN file="$(ls -1 )" && echo $file
---> Running in 281d9580d608
README.md app config docker-compose.yml
Removing intermediate container 281d9580d608
---> 99eaafb1a55d
Step 7/7 : RUN pip install -r requirements.txt
---> Running in d0e180d83772
[91mERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
Removing intermediate container d0e180d83772
The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1
app/Dockerfile
FROM python:3.8.3-alpine
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . .
RUN file="$(ls -1 )" && echo $file
RUN pip install -r requirements.txt
docker-composer.yml
version: '3'
services:
web:
build:
context: app
dockerfile: Dockerfile
volumes:
- ./app/:/code/
ports:
- "8000:8000"
env_file:
- ./config/.env.dev
command: python manage.py runserver 0.0.0.0:8000
项目结构:
更新:
Docker 正在从 Github 构建。
文件 requirements.txt 位于 GitHub 存储库(app 文件夹)中,但由于某些原因在构建期间 Docker Hub 从项目根文件夹复制文件而不是 app 文件夹的内容。
谢谢,我找到了解决方案:
我只是将文件从./app 复制到挂载的卷,几乎没有改变上下文,但仍然不明白为什么它在本地机器上运行良好
Dockerfile:
FROM python:3.8.3-alpine
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY ./app .
RUN pip install -r requirements.txt
docker-compose.yml
version: "3.6"
services:
python:
restart: always
build:
context: .
dockerfile: docker/Dockerfile
expose:
- 8000
ports:
- 8000:8000
command: "python manage.py runserver 0.0.0.0:8000"
问题是您需要告诉 Docker Hub 在哪里可以找到您的构建上下文。
当你 运行 docker-compose build
在本地时,docker-compose
读取你的 docker-compose.yml
文件并知道在 app
目录中构建,因为你已经明确设置构建上下文:
build:
context: app
dockerfile: Dockerfile
当您在 Docker Hub 上构建时,默认情况下它将采用构建
上下文是您存储库的顶层。如果您将路径设置为
例如,您的 Dockerfile
到 app/Dockerfile
,这相当于
运行宁:
docker build -f app/Dockerfile .
如果你尝试这样做,你会看到是否以同样的方式失败。而不是设置
Dockerfile
的路径,你需要设置构建的路径
app
目录的上下文。例如:
(查看“构建上下文”列)。
如果配置正确,您的存储库将在 Docker Hub 上构建而不会出现错误。
我正在尝试将 Django 应用程序上传到 Docker Hub。在本地计算机 (Ubuntu 18.04) 上一切正常,但在 Docker Hub 上存在无法找到 requirements.txt 文件的问题。
本地机器:
sudo docker-compose build --no-cache
结果(还可以):
Step 5/7 : COPY . .
---> 5542d55caeae
Step 6/7 : RUN file="$(ls -1 )" && echo $file
---> Running in b85a55aa2640
Dockerfile db.sqlite3 hello_django manage.py requirements.txt venv
Removing intermediate container b85a55aa2640
---> 532e91546d41
Step 7/7 : RUN pip install -r requirements.txt
---> Running in e940ebf96023
Collecting Django==3.2.2....
但是,Docker 中心:
Step 5/7 : COPY . .
---> 852fa937cb0a
Step 6/7 : RUN file="$(ls -1 )" && echo $file
---> Running in 281d9580d608
README.md app config docker-compose.yml
Removing intermediate container 281d9580d608
---> 99eaafb1a55d
Step 7/7 : RUN pip install -r requirements.txt
---> Running in d0e180d83772
[91mERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
Removing intermediate container d0e180d83772
The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1
app/Dockerfile
FROM python:3.8.3-alpine
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . .
RUN file="$(ls -1 )" && echo $file
RUN pip install -r requirements.txt
docker-composer.yml
version: '3'
services:
web:
build:
context: app
dockerfile: Dockerfile
volumes:
- ./app/:/code/
ports:
- "8000:8000"
env_file:
- ./config/.env.dev
command: python manage.py runserver 0.0.0.0:8000
项目结构:
更新: Docker 正在从 Github 构建。 文件 requirements.txt 位于 GitHub 存储库(app 文件夹)中,但由于某些原因在构建期间 Docker Hub 从项目根文件夹复制文件而不是 app 文件夹的内容。
谢谢,我找到了解决方案:
我只是将文件从./app 复制到挂载的卷,几乎没有改变上下文,但仍然不明白为什么它在本地机器上运行良好
Dockerfile:
FROM python:3.8.3-alpine
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY ./app .
RUN pip install -r requirements.txt
docker-compose.yml
version: "3.6"
services:
python:
restart: always
build:
context: .
dockerfile: docker/Dockerfile
expose:
- 8000
ports:
- 8000:8000
command: "python manage.py runserver 0.0.0.0:8000"
问题是您需要告诉 Docker Hub 在哪里可以找到您的构建上下文。
当你 运行 docker-compose build
在本地时,docker-compose
读取你的 docker-compose.yml
文件并知道在 app
目录中构建,因为你已经明确设置构建上下文:
build:
context: app
dockerfile: Dockerfile
当您在 Docker Hub 上构建时,默认情况下它将采用构建
上下文是您存储库的顶层。如果您将路径设置为
例如,您的 Dockerfile
到 app/Dockerfile
,这相当于
运行宁:
docker build -f app/Dockerfile .
如果你尝试这样做,你会看到是否以同样的方式失败。而不是设置
Dockerfile
的路径,你需要设置构建的路径
app
目录的上下文。例如:
(查看“构建上下文”列)。
如果配置正确,您的存储库将在 Docker Hub 上构建而不会出现错误。