我正在玩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.dart
或pubspec.yaml
。
所以,google/dart-runtime
是一个很好的基础,如果您的服务器位于bin/server.dart
并且您想要在端口8080上侦听。因为我想在端口80上侦听,我我使用google/dart
图像作为基础,希望将google/dart-runtime
和google/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相同的目录中,我有以下文件:
我正在构建图像:
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
答案 0 :(得分:7)
ONBUILD
指令仅在您创建稍后将由另一个Dockerfile使用的基本映像时才有用(请参阅documentation)。
这里因为你编写了最终的Dockerfile,你只需删除ONBUILD
指令(但保留原始指令ADD
,RUN
等)。
答案 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-hello的Dockerfile
,您会看到它只有一行。