With these files:
base.yml:
version: '2'
services:
_nginx:
image: nginx:1.11.12
docker-compose.yml:
version: '2'
services:
nginx:
extends:
file: base.yml
service: _nginx
ports:
- "8080:80"
Running config:
$ docker-compose config
Traceback (most recent call last):
File "/home/ken/.virtualenvs/compose3_clean/bin/docker-compose", line 11, in <module>
sys.exit(main())
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/compose/cli/main.py", line 67, in main
command()
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/compose/cli/main.py", line 111, in perform_command
handler(command, options, command_options)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/compose/cli/main.py", line 306, in config
print(serialize_config(compose_config, image_digests))
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/compose/config/serialize.py", line 62, in serialize_config
width=80)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/__init__.py", line 216, in safe_dump
return dump_all([data], stream, Dumper=SafeDumper, **kwds)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/__init__.py", line 188, in dump_all
dumper.represent(data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 26, in represent
node = self.represent_data(data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 47, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 205, in represent_dict
return self.represent_mapping('tag:yaml.org,2002:map', data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 116, in represent_mapping
node_value = self.represent_data(item_value)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 47, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 205, in represent_dict
return self.represent_mapping('tag:yaml.org,2002:map', data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 116, in represent_mapping
node_value = self.represent_data(item_value)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 47, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 205, in represent_dict
return self.represent_mapping('tag:yaml.org,2002:map', data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 116, in represent_mapping
node_value = self.represent_data(item_value)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 57, in represent_data
node = self.yaml_representers[None](self, data)
File "/home/ken/.virtualenvs/compose3_clean/lib/python3.5/site-packages/yaml/representer.py", line 229, in represent_undefined
raise RepresenterError("cannot represent an object: %s" % data)
yaml.representer.RepresenterError: cannot represent an object: <map object at 0x7f3caace4470>
$ docker-compose --version
docker-compose version 1.12.0, build b31ff33
$ python -V
Python 3.5.2
$ pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
appdirs (1.4.3)
cached-property (1.3.0)
click (6.7)
colorama (0.3.7)
docker (2.2.1)
docker-compose (1.12.0)
docker-pycreds (0.2.1)
dockerpty (0.4.1)
docopt (0.6.2)
first (2.0.1)
jsonschema (2.6.0)
packaging (16.8)
pip (9.0.1)
pip-tools (1.8.2)
pyparsing (2.2.0)
PyYAML (3.12)
requests (2.11.1)
setuptools (34.3.3)
six (1.10.0)
texttable (0.8.8)
websocket-client (0.40.0)
wheel (0.29.0)
$ docker info
Containers: 3
Running: 0
Paused: 0
Stopped: 3
Images: 181
Server Version: 17.04.0-ce
Storage Driver: aufs
Root Dir: /media/r0/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 577
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary:
containerd version: 422e31ce907fd9c3833a38d7b8fdd023e5a76e73
runc version: 9c2d8d184e5da67c95d601382adf14862e4f2228
init version: 949e6fa
Security Options:
apparmor
seccomp
Profile: default
Kernel Version: 4.4.0-71-generic
Operating System: Ubuntu 16.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.56GiB
Name: oblako
ID: V6CL:5652:TVAP:Z4Q2:DOBE:CHDS:G3MY:Y6TU:BWGK:5B6E:REYP:PNGR
Docker Root Dir: /media/r0/var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: oeuftete
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: No swap limit support
Similar cases that do work for me:
nginx with ports (no extends)There is also a case where extended ports also ends up being None when using up, but I haven't been able to narrow that one down: ERROR: for nginx Cannot create container for service nginx: b'invalid port specification: "None"'
Maybe #4653 is related, although it sounds like the opposite case where already defined ports go away when using extends, whereas here something is wrong with ports when being extended.
Thank you for the report. We'll take a look ASAP
This seems to do the trick:
diff --git a/compose/config/serialize.py b/compose/config/serialize.py
index 5b36124..b06922a 100644
--- a/compose/config/serialize.py
+++ b/compose/config/serialize.py
@@ -111,9 +111,9 @@ def denormalize_service_dict(service_dict, version, image_digest=None):
)
if 'ports' in service_dict and version not in (V3_2,):
- service_dict['ports'] = map(
+ service_dict['ports'] = list(map(
lambda p: p.legacy_repr() if isinstance(p, types.ServicePort) else p,
service_dict['ports']
- )
+ ))
return service_dict
Hey @shin- Thanks so much for the fix. Silly question, I'm running docker for mac (edge) and I'm running into this error, how can apply this patch?
Here is my setup:
$ docker-compose --version
docker-compose version 1.13.0dev, build b31ff33
Bug still happens in 1.12.0
$ docker-compose version
docker-compose version 1.12.0, build b31ff33
docker-py version: 2.2.1
CPython version: 3.4.2
OpenSSL version: OpenSSL 1.0.2k 26 Jan 2017
$ docker version
Client:
Version: 17.04.0-ce
API version: 1.28
Go version: go1.7.5
Git commit: 4845c56
Built: Mon Apr 3 17:45:49 2017
OS/Arch: linux/amd64
Server:
Version: 17.04.0-ce
API version: 1.28 (minimum version 1.12)
Go version: go1.7.5
Git commit: 4845c56
Built: Mon Apr 3 17:45:49 2017
OS/Arch: linux/amd64
Experimental: false
$ docker-compose version
docker-compose version 1.12.0, build b31ff33
docker-py version: 2.2.1
CPython version: 3.4.2
OpenSSL version: OpenSSL 1.0.2k 26 Jan 2017
$ docker-compose up
Starting project_var_1
project_db_1 is up-to-date
project_app_1 is up-to-date
Recreating 0e2abce94f50_0e2abce94f50_0e2abce94f50_0e2abce94f50_project_nginx_1
ERROR: for nginx Cannot create container for service nginx: b'invalid port specification: "None"'
ERROR: Encountered errors while bringing up the project.
the container:
nginx:
image: nginx
volumes:
- ./etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8030:80"
volumes_from:
- var
links:
- app
Most helpful comment
Bug still happens in 1.12.0
the container: