为什么Docker没有将文件添加到我的容器中?

时间:2014-09-18 17:38:21

标签: dart docker

我正在玩Google's Dart docker image。我正在尝试构建一个侦听端口80的Hello World应用程序。我在Azure上的Ubuntu Server 14上运行它。

如果我运行google/dart-hello,一切正常,我可以在端口8080上连接。

google/dart-hello图片基于google/dart-runtime图片,而图片则基于google/dart。基础图像添加了Dart; google/dart-runtime添加了一个Dockerfile,它希望执行bin/server.dart并公开端口8080,google/dart-hello提供bin/server.dart(和pubspec.yaml)以使其正常工作。 google/dart-runtime本身没用,因为它不包含bin/server.dartpubspec.yaml

所以,google/dart-runtime是一个很好的基础,如果您的服务器位于bin/server.dart 并且您想要在端口8080上侦听。因为我想在端口80上侦听,我我使用google/dart图像作为基础,希望将google/dart-runtimegoogle/dart-hello中的内容压缩到我的容器中,但更改为端口80。

您可以在此处找到三张Google图片的来源回购:

所以,我从google/dart-runtime获取了Dockerfile,从google/dart-hello获取了文件,所以我有以下内容:

FROM google/dart

WORKDIR /app
ONBUILD ADD pubspec.yaml /app/
ONBUILD ADD pubspec.lock /app/
ONBUILD RUN pub get
ONBUILD ADD . /app
ONBUILD RUN pub get

CMD []
ENTRYPOINT ["/usr/bin/dart", "/app/bin/server.dart"]
EXPOSE 80

在与此Dockerfile相同的目录中,我有以下文件:

  • 仓/ server.dart
  • pubspec.yaml
  • pubspec.lock

我正在构建图像:

sudo docker build --no-cache -t dart-test .

这是输出:

danny@linux:~/dart_test$ sudo docker build --no-cache -t dart-test .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM google/dart
 ---> cd92c7fff717
Step 1 : WORKDIR /app
 ---> Running in d163d2597eba
 ---> 2802d6769b76
Removing intermediate container d163d2597eba
Step 2 : ONBUILD ADD pubspec.yaml /app/
 ---> Running in 7b8be2a481c2
 ---> 096cbe12a2cd
Removing intermediate container 7b8be2a481c2
Step 3 : ONBUILD ADD pubspec.lock /app/
 ---> Running in 6ae0243b0dee
 ---> 80f20ebafa87
Removing intermediate container 6ae0243b0dee
Step 4 : ONBUILD RUN pub get
 ---> Running in 621d4ce5c7f1
 ---> 89a509d41b11
Removing intermediate container 621d4ce5c7f1
Step 5 : ONBUILD ADD . /app
 ---> Running in 4de26a33487f
 ---> b69c65f12441
Removing intermediate container 4de26a33487f
Step 6 : ONBUILD RUN pub get
 ---> Running in f7cc689f6f81
 ---> 2ccc79ea6d04
Removing intermediate container f7cc689f6f81
Step 7 : CMD []
 ---> Running in 10bd31eb6679
 ---> f828267f00b5
Removing intermediate container 10bd31eb6679
Step 8 : ENTRYPOINT ["/usr/bin/dart", "/app/bin/server.dart"]
 ---> Running in 013d3ca0f25d
 ---> a63b59f9fd05
Removing intermediate container 013d3ca0f25d
Step 9 : EXPOSE 80
 ---> Running in 4301c572e598
 ---> 75a4317c135c
Removing intermediate container 4301c572e598
Successfully built 75a4317c135c

但是,如果我尝试运行它(使用sudo docker run --rm -i -t dart-test),我会收到以下错误:

danny@linux:~/dart_test$ sudo docker run -i -t --rm dart-test
Unhandled exception:
Uncaught Error: FileSystemException: Cannot open file, path = '/app/bin/server.dart' (OS Error: No such file or directory, errno = 2)

如果我用dart替换Dockerfile中的/bin/bash执行,那么当我构建并运行时,我会被bash放在/app/但该文件夹是

我已尝试使用0.9(?)版本和1.2(一个来自apt-get docker.io,另一个来自Docker网站上涉及更多的说明),因为我注意到提到了ADD修复了发行说明。两者都是一样的。

我可以在网上找到很多信息,人们经常将Dockerfile传输到STDIN,这意味着没有context,但是你可以在我的输出中看到正在发送5KB的数据;虽然它可能只是Dockerfile而我猜其他什么?它们位于同一目录中,这是一个列表:

danny@linux:~/dart_test$ dir
bin  Dockerfile  pubspec.lock  pubspec.yaml

3 个答案:

答案 0 :(得分:7)

ONBUILD指令仅在您创建稍后将由另一个Dockerfile使用的基本映像时才有用(请参阅documentation)。

这里因为你编写了最终的Dockerfile,你只需删除ONBUILD指令(但保留原始指令ADDRUN等)。

答案 1 :(得分:3)

Dockerfile中,您需要从指示中删除ONBUILD前缀。 ONBUILD前缀是一种延迟执行某些指令的方法,直到该映像被另一个Dockerfile引用。这些指令存储为您创建的图像的元数据的一部分,但在另一个FROM的{​​{1}}字段中引用该图像之前,指令本身不会执行。

你真正想要的是:

Dockerfile

答案 2 :(得分:3)

docker image google / dart-runtime旨在成为Dart服务器应用程序的基本映像。因此,在您的项目中,Dockerfile应该只包含以下内容

FROM google/dart-runtime

当您运行docker build时,将执行基本映像中的ONBUILD命令。

如果您查看google/dart-helloDockerfile,您会看到它只有一行。