我有一个简单的docker-compose
定义,我想运行一个简单的cmd
/bash
命令:
basictests:
image: ${DOCKER_REGISTRY-}mytests
build:
context: .
dockerfile: MyTests/Dockerfile
container_name: "mytestscontainer"
command:
- echo "test"
depends_on:
dependent_env:
condition: service_healthy
注意:这只是一个简化的测试。我想运行一些更复杂的脚本,而不是调用echo
。
然而,当我运行这个配置时,它会抛出以下错误:
==> /dev/null <==
tail: cannot open 'echo "test"' for reading: No such file or directory
不确定 tail
是从哪里出现的,以及如何修复。查看this,它应该可以工作。如果我删除 command
,它就可以正常工作。任何帮助都将不胜感激。
更新:DockerFile 除了安装 dotnet
和构建我的库之外,什么都没有做。
更新2:基本 Docker 文件是:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
# restore
COPY ["MyTests/MyTests.csproj", "MyTests/"]
RUN dotnet restore "MyTests/MyTests.csproj"
# build
COPY . .
WORKDIR "/src/MyTests"
RUN dotnet build "MyTests.csproj" -c Release -o /app/build
在上述Docker文件的末尾添加建议的ENTRYPOINT ["/bin/bash", "-c"]
并没有起到帮助作用。
注意:我对Docker和Docker Compose都是新手。
更新3:
在Docketfile的末尾添加ENTRYPOINT ["tail", "-f", "/dev/null"]
,并将命令调用方式更改为command: [echo, test]
也没有起到帮助作用。总的来说,我很好奇tail
是怎么回事?为什么它在这种情况下出现呢?
注意:为了上下文,我想配置一个能够与多个容器一起工作的集成测试,所以我想运行dotnet test ..
而不是echo ..
来进行我的集成测试。
更新4: 以下是配置:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
EXPOSE 80
EXPOSE 443
# restore
COPY ["MyTests/MyTests.csproj", "MyTests/"]
RUN dotnet restore "MyTests/MyTests.csproj"
# build
COPY . .
WORKDIR "/src/MyTests"
RUN dotnet build "MyTests.csproj" -c Release -o /app/build
ENTRYPOINT ["/bin/bash"]
如果我在本地cmd中运行它,它可以正常工作:
%SomePath%\Demo>docker build -f MyTests/Dockerfile -t mytest .
[+] Building 0.3s (12/12) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 32B
=> [internal] load .dockerignore
=> => transferring context: 35B
=> [internal] load metadata for mcr.microsoft.com/dotnet/sdk:6.0
=> [1/7] FROM mcr.microsoft.com/dotnet/sdk:6.0
=> [internal] load build context
=> => transferring context: 2.00kB
=> CACHED [2/7] WORKDIR /src
=> CACHED [3/7] COPY [MyTests/MyTests.csproj, MyTests/]
=> CACHED [4/7] RUN dotnet restore "MyTests/MyTests.csproj"
=> CACHED [5/7] COPY . .
=> CACHED [6/7] WORKDIR /src/MyTests
=> CACHED [7/7] RUN dotnet build "MyTests.csproj" -c Release -o /app/build
=> exporting to image
=> => exporting layers
=> => writing image sha256:9c...
=> => naming to docker.io/library/mytest
%SomePath%\Demo>docker run -it mytest
root@999afef78716:/src/MyTests# ls
MyTests.csproj ApiTests.cs Properties obj
所以,看起来问题只是如何从docker-compose配置中正确调用它。我还尝试设置以下选项
..
image: ${DOCKER_REGISTRY-}mytests
stdin_open: true # docker run -i
tty: true # docker run -t
..
没有运气。
更新5: 我尝试将所有逻辑简化为这两个文件,并使用新的控制台应用程序:
Dockerfile:
FROM alpine:3.14
WORKDIR "/src"
CMD ["/bin/bash"]
# same behavior if I use `CMD ["/bin/sh"]`
docker-compose:
version: '3.4'
services:
consoleappdocker:
image: ${DOCKER_REGISTRY-}consoleappdocker
build:
context: .
dockerfile: ConsoleAppDocker/Dockerfile
container_name: "consoleappdocker"
command: ["/bin/bash", "-c", "echo test"]
仍然出现“tail: invalid number 'echo test'
”错误,但我刚刚注意到了这个输出:
docker ps -a --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
%id% consoleappdocker:dev "tail -f /dev/null /bin/bash -c 'echo test'" 7 minutes ago Exited (1) 7 minutes ago consoleappdocker
看起来@VonC是正确的,但我不知道这个tail
部分最初是在哪里添加的。
更新6:显然,tail
部分是由我用于构建和运行应用程序的Visual Studio添加的,我在日志中找到了它:
docker-compose -f "%PATH%\docker-compose.yml" -f "%PATH%\docker-compose.override.yml" -f "%PATH%\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose14997374556887134345 --ansi never --profile "*" config
name: dockercompose14997374556887134345
services:
consoleappdocker:
build:
context: %PATH%
dockerfile: ConsoleAppDocker/Dockerfile
labels:
com.microsoft.created-by: visual-studio
com.microsoft.visual-studio.project-name: ConsoleAppDocker
command:
- /bin/bash
- -c
- echo test
container_name: consoletest
entrypoint:
- tail
- -f
- /dev/null
environment:
..
image: consoleappdocker:dev
labels:
..
networks:
default: null
tty: true
volumes:
..
networks:
default:
name: dockercompose14997374556887134345_default
docker-compose -f "%PATH%\docker-compose.yml" -f "%PATH%\docker-compose.override.yml" -f "%PATH%\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose14997374556887134345 --ansi never build
情况相当出乎意料,但我认为下一步该做什么或多或少是清楚的。
ENTRYPOINT ["tail", "-f", "/dev/null"]
"来保持容器的活动状态";我倾向于认为这不是最佳实践。在您的command:
列表中,如果您有一个数组,您需要将单独的单词放在不同的列表项中,command: [echo, test]
;还请参见Docker compose executable file not found in $PATH": unknown。 - David MazeENTRYPOINT ["tail", "-f", "/dev/null"]
并将command
更改为command: [echo, test]
,它仍然会出现相同的错误。而且一般来说,tail
是怎么回事?为什么它会出现在错误中? - Unnamedtail
命令不是一个好主意,我不建议包含它,但错误消息表明它在您的镜像中某个地方。 .NET Dockerfiles的堆栈没有在任何基本映像中建议任何特定的ENTRYPOINT
或CMD
。 - David Maze