Dockerfile 不能 运行 使用 "docker-compose-up --build" 命令的容器
Dockerfile cannot run a container using "docker-compose-up --build" command
Docker文件不能运行使用“docker-compose-up --build”命令的容器
当我运行Docker文件使用“docker-compose up --build”命令时,输出找不到文件,容器不是运行宁.
Docker文件,docker-compose.yaml,目录和结果如下。
Docker版本:
\server>docker --version
Docker version 20.10.14, build a224086
Docker文件:
FROM openjdk:14-jdk-alpine3.10
RUN mkdir -p /app/workspace/config && \
mkdir -p /app/workspace/lib && \
mkdir -p /app/workspace/bin
WORKDIR /app/workspace
VOLUME /app/workspace
COPY ./bin ./bin
COPY ./config ./config
COPY ./lib ./lib
RUN chmod 774 /app/workspace/bin/*.sh
EXPOSE 6969
WORKDIR /app/workspace/bin
ENTRYPOINT ./startServer.sh
docker-compose.yaml:
version: '3'
services:
server:
container_name: cn-server
build:
context: ./server/
dockerfile: Dockerfile
ports:
- "6969:6969"
volumes:
- ${SERVER_HOST_DIR}:/app/workspace
networks:
- backend
networks:
backend:
driver: bridge
目录:
enter image description here
"docker-compose up --build"命令执行结果:
Building server
[+] Building 3.7s (13/13) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 425B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:14-jdk-alpine3.10 2.0s
=> [internal] load build context 0.0s
=> => transferring context: 239B 0.0s
=> CACHED [1/8] FROM docker.io/library/openjdk:14-jdk-alpine3.10@sha256:b8082268ef46d44ec70fd5a64c71d445492941813ba9d68049be6e63a0da542f 0.0s
=> [2/8] RUN mkdir -p /app/workspace/config && mkdir -p /app/workspace/lib && mkdir -p /app/workspace/bin 0.4s
=> [3/8] WORKDIR /app/workspace 0.1s
=> [4/8] COPY ./bin ./bin 0.1s
=> [5/8] COPY ./config ./config 0.1s
=> [6/8] COPY ./lib ./lib 0.1s
=> [7/8] RUN chmod 774 /app/workspace/bin/*.sh 0.5s
=> [8/8] WORKDIR /app/workspace/bin 0.1s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:984554c9d7d9b3312fbe2dc76b4c7381e93cebca3a808ca16bd9e3777d42f919 0.0s
=> => naming to docker.io/library/docker_cn-server 0.0s
Creating cn-server ... done
Attaching to cn-server
cn-server | /bin/sh: ./startServer.sh: not found
cn-server exited with code 127
另外bin、config、lib目录没有在host volume目录下创建,也没有文件。
请告诉我我哪里错了或者我用错了什么。
谢谢。
这里有两个明显的问题,都与 Docker 卷有关。
在你的 Docker 文件中,你切换到 WORKDIR /app/workspace
并在那里做一些工作,但随后在 Compose 设置中,你 bind-mount 一个主机目录覆盖了整个 /app/workspace
.这会导致 Docker 文件中的所有工作丢失,并用来自主机的不可预测的内容替换图像中的代码。在 docker-compose.yml
文件中,您应该删除 volumes:
块。您应该能够将显示的内容减少到
version: '3.8'
services:
server:
build: ./server
ports:
- '6969:6969'
第二个问题出在Docker文件本身。您很早就声明了 VOLUME /app/workspace
。不过,这是不必要的,其最明显的影响是导致该目录中的后续 RUN
命令无效。所以特别是你的 RUN chmod ...
命令没有发生。删除 VOLUME
行可以帮助解决这个问题。 (您也不需要 RUN mkdir
您将要 COPY
的目录到图像中。)
FROM openjdk:14-jdk-alpine3.10
WORKDIR /app/workspace
COPY ./bin ./bin
COPY ./config ./config
COPY ./lib ./lib
RUN chmod 0755 bin/*.sh
EXPOSE 6969
WORKDIR /app/workspace/bin
CMD ["./startServer.sh"]
根据 startServer.sh
文件的内容,还有其他潜在问题。我希望这是一个 shell 脚本,它的第一行是一个“shebang”行,#!/bin/sh
。如果它明确命名 GNU Bash 或另一个 shell,那将不会出现在 Alpine-based 图像中。如果您在 Windows-based 系统上工作并且文件有 DOS 行结尾,这也会导致错误。
Docker文件不能运行使用“docker-compose-up --build”命令的容器
当我运行Docker文件使用“docker-compose up --build”命令时,输出找不到文件,容器不是运行宁.
Docker文件,docker-compose.yaml,目录和结果如下。
Docker版本:
\server>docker --version
Docker version 20.10.14, build a224086
Docker文件:
FROM openjdk:14-jdk-alpine3.10
RUN mkdir -p /app/workspace/config && \
mkdir -p /app/workspace/lib && \
mkdir -p /app/workspace/bin
WORKDIR /app/workspace
VOLUME /app/workspace
COPY ./bin ./bin
COPY ./config ./config
COPY ./lib ./lib
RUN chmod 774 /app/workspace/bin/*.sh
EXPOSE 6969
WORKDIR /app/workspace/bin
ENTRYPOINT ./startServer.sh
docker-compose.yaml:
version: '3'
services:
server:
container_name: cn-server
build:
context: ./server/
dockerfile: Dockerfile
ports:
- "6969:6969"
volumes:
- ${SERVER_HOST_DIR}:/app/workspace
networks:
- backend
networks:
backend:
driver: bridge
目录: enter image description here
"docker-compose up --build"命令执行结果:
Building server
[+] Building 3.7s (13/13) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 425B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:14-jdk-alpine3.10 2.0s
=> [internal] load build context 0.0s
=> => transferring context: 239B 0.0s
=> CACHED [1/8] FROM docker.io/library/openjdk:14-jdk-alpine3.10@sha256:b8082268ef46d44ec70fd5a64c71d445492941813ba9d68049be6e63a0da542f 0.0s
=> [2/8] RUN mkdir -p /app/workspace/config && mkdir -p /app/workspace/lib && mkdir -p /app/workspace/bin 0.4s
=> [3/8] WORKDIR /app/workspace 0.1s
=> [4/8] COPY ./bin ./bin 0.1s
=> [5/8] COPY ./config ./config 0.1s
=> [6/8] COPY ./lib ./lib 0.1s
=> [7/8] RUN chmod 774 /app/workspace/bin/*.sh 0.5s
=> [8/8] WORKDIR /app/workspace/bin 0.1s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:984554c9d7d9b3312fbe2dc76b4c7381e93cebca3a808ca16bd9e3777d42f919 0.0s
=> => naming to docker.io/library/docker_cn-server 0.0s
Creating cn-server ... done
Attaching to cn-server
cn-server | /bin/sh: ./startServer.sh: not found
cn-server exited with code 127
另外bin、config、lib目录没有在host volume目录下创建,也没有文件。
请告诉我我哪里错了或者我用错了什么。
谢谢。
这里有两个明显的问题,都与 Docker 卷有关。
在你的 Docker 文件中,你切换到 WORKDIR /app/workspace
并在那里做一些工作,但随后在 Compose 设置中,你 bind-mount 一个主机目录覆盖了整个 /app/workspace
.这会导致 Docker 文件中的所有工作丢失,并用来自主机的不可预测的内容替换图像中的代码。在 docker-compose.yml
文件中,您应该删除 volumes:
块。您应该能够将显示的内容减少到
version: '3.8'
services:
server:
build: ./server
ports:
- '6969:6969'
第二个问题出在Docker文件本身。您很早就声明了 VOLUME /app/workspace
。不过,这是不必要的,其最明显的影响是导致该目录中的后续 RUN
命令无效。所以特别是你的 RUN chmod ...
命令没有发生。删除 VOLUME
行可以帮助解决这个问题。 (您也不需要 RUN mkdir
您将要 COPY
的目录到图像中。)
FROM openjdk:14-jdk-alpine3.10
WORKDIR /app/workspace
COPY ./bin ./bin
COPY ./config ./config
COPY ./lib ./lib
RUN chmod 0755 bin/*.sh
EXPOSE 6969
WORKDIR /app/workspace/bin
CMD ["./startServer.sh"]
根据 startServer.sh
文件的内容,还有其他潜在问题。我希望这是一个 shell 脚本,它的第一行是一个“shebang”行,#!/bin/sh
。如果它明确命名 GNU Bash 或另一个 shell,那将不会出现在 Alpine-based 图像中。如果您在 Windows-based 系统上工作并且文件有 DOS 行结尾,这也会导致错误。